Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Visual C Consolidada PT BR
Apostila Visual C Consolidada PT BR
Janeiro, 2007
Visual C# Consolidado
NDICE
VISUAL C#......................................................................................................................................................................16 GUIA DE INTRODUO AO VISUAL C#......................................................................................................17 GUIA DA DOCUMENTAO DO VISUAL C#....................................................................................................................17 INTRODUO LINGUAGEM C# E AO .NET FRAMEWORK ............................................................................................18 O QUE H DE NOVO NO VISUAL C# 2005.......................................................................................................................20 O QUE H DE NOVO NA C# 2.0 IDIOMA E COMPILER ......................................................................................................22 ATUALIZANDO APLICATIVOS VISUAL C# PARA VISUAL STUDIO 2005..........................................................................24 CRIANDO SEU PRIMEIRO APLICATIVO C# .....................................................................................................................25 USANDO STARTER KITS C#...........................................................................................................................................26 RECURSOS DE AJUDA ADICIONAIS (VISUAL C#)...........................................................................................................26 COMO FAZER EM C# .....................................................................................................................................................27 USANDO O IDE DO VISUAL C# .......................................................................................................................29 INTRODUO IDE (VISUAL C#).................................................................................................................................29 CRIANDO UM PROJETO (VISUAL C#).............................................................................................................................31 PROJETANDO UMA INTERFACE DE USURIO (VISUAL C#) .............................................................................................34 O INTELLISENSE ...........................................................................................................................................................36 LISTAS DE CONCLUSO .................................................................................................................................................37 INFORMAES RPIDAS ................................................................................................................................................37 MEMBROS DA LISTA ......................................................................................................................................................37 INFORMAES DE PARMETRO .....................................................................................................................................37 ADICIONANDO DIRETIVAS 'USING' .................................................................................................................................38 REFATORAO ..............................................................................................................................................................38 TRECHOS DE CDIGO ....................................................................................................................................................38 SUBLINHADO ONDULADO ..............................................................................................................................................38 AJUDA DE LEGIBILIDADE ..............................................................................................................................................39 Estrutura de tpicos ................................................................................................................................................39 COLORIZAO ..............................................................................................................................................................39 NAVEGANDO E PROCURANDO.........................................................................................................................40 EXIBIO DE CLASSE ....................................................................................................................................................40 NAVEGAO CTRL+TAB............................................................................................................................................40 BARRAS DE NAVEGAO ..............................................................................................................................................41 LOCALIZAR EM ARQUIVOS ............................................................................................................................................42 CRIANDO E DEPURANDO (VISUAL C#) .....................................................................................................43 MODELAGEM E ANLISE DE CDIGO (VISUAL C#)............................................................................46 ADICIONANDO E EDITANDO RECURSOS (VISUAL C#) ....................................................................49 OBTENDO AJUDA (VISUAL C#) ......................................................................................................................51 IMPLANTANDO APLICATIVOS C# .................................................................................................................54 RECURSOS DO CODE EDITOR DO VISUAL C#.................................................................................................................54 Refatorao .............................................................................................................................................................54 TRECHOS DE CDIGOS (C#)...........................................................................................................................................55 CDIGO COLORIZATION ................................................................................................................................................56 METADADOS COMO FONTE ............................................................................................................................................58 CONFIGURAES DO IDE VISUAL C# ...........................................................................................................................59 ATALHOS DE TECLADO VISUAL C#...............................................................................................................................60 Teclas de atalho.......................................................................................................................................................60 TECLAS DE ATALHO PADRO CONFIGURAES DEVELOPMENT GERAIS ........................................................................62 ESCREVENDO APLICATIVOS COM O VISUAL C# ..................................................................................64 USANDO A BIBLIOTECA DE CLASSE DO .NET FRAMEWORK (VISUAL C#).....................................................................64 CRIANDO APLICATIVOS DO WINDOWS FORMS (VISUAL C#) .........................................................................................65 CRIANDO APLICATIVOS DE CONSOLE (VISUAL C#) ......................................................................................................65 ACESSAR E EXIBIR DADOS (VISUAL C#)........................................................................................................................65 CRIANDO APLICATIVOS MVEIS E INCORPORADOS (VISUAL C#) .................................................................................66
Visual C# Consolidado
CRIANDO E ACESSANDO SERVIOS DA WEB (VISUAL C#)...........................................................67 CRIANDO COMPONENTES (VISUAL C#)....................................................................................................68 DESENVOLVENDO NA PLATAFORMA DO OFFICE (VISUAL C#) ......................................................................................68 Programao do Office (Como Fazer em C#).........................................................................................................68 Como: Atualizar solues das Ferramentas do Visual Studio para o Office ..........................................................69 O EXCEL USANDO EXPLICAES PASSO-A-PASSO.............................................................................71 COLETA DE DADOS USANDO UM FORMULRIO DO WINDOWS WALKTHROUGH .............................................................71 ALTERANDO PLANILHA FORMATAO USANDO CONTROLES CHECKBOX WALKTHROUGH: .........................................73 EXIBINDO TEXTO EM UMA CAIXA DE TEXTO EM UMA PLANILHA USANDO UM BOTO WALKTHROUGH: ........................76 PROGRAMAO CONTRA EVENTOS DE UM CONTROLE NAMEDRANGE WALKTHROUGH:...............................................78 PASSO-A-PASSO: CONCEDENDO E REMOVENDO PERMISSES PARA UMA SOLUO DO OFFICE .....................................81 PASSO-A-PASSO: LIGANDO UMA CLULA DE PLANILHA A UM CAMPO DE BANCO DE DADOS ..........................................84 WALKTHROUGH: VINCULAO CLULAS PARA VRIAS COLUNAS EM UMA TABELA .....................................................87 CRIANDO UMA RELAO MESTRE / DETALHES USANDO UM DATASET EM CACHE WALKTHROUGH: .............................91 WALKTHROUGH: ATUALIZANDO UM GRFICO EM UMA PLANILHA USANDO BOTES DE OPO ....................................94 VINCULAO DE DADOS PARA CONTROLES EM UM PAINEL AES DO EXCEL WALKTHROUGH: ..................................99 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM MANIFESTO DEPLOYMENT WALKTHROUGH: ..........103 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM ARQUIVO DO WINDOWS INSTALLER WALKTHROUGH: ....................................................................................................................................................................................107 PASSO-A-PASSO: CONCEDENDO E REMOVENDO PERMISSES PARA UMA SOLUO DO OFFICE ...................................112 O WORD USANDO EXPLICAES PASSO-A-PASSO ..........................................................................116 WALKTHROUGH: CHANGING DOCUMENT FORMATAO USANDO CONTROLES CHECKBOX .......................................116 EXIBINDO TEXTO EM UMA CAIXA DE TEXTO EM UM DOCUMENTO USANDO UM BOTO WALKTHROUGH:....................119 WALKTHROUGH: CRIANDO MENUS DE ATALHO PARA INDICADORES ...........................................................................121 WALKTHROUGH: ATUALIZANDO UM GRFICO EM UM DOCUMENTO USANDO BOTES DE OPO ................................124 VINCULAO DE DADOS PARA CONTROLES EM UM PAINEL AES DO WORD WALKTHROUGH: ................................128 WALKTHROUGH: CRIAR UMA MARCA INTELIGENTE QUE CONVERTE TEMPERATURES DE FAHRENHEIT PARA CELSIUS133 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM MANIFESTO DEPLOYMENT WALKTHROUGH: ..........135 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM ARQUIVO DO WINDOWS INSTALLER WALKTHROUGH: ....................................................................................................................................................................................139 PASSO-A-PASSO: CONCEDENDO E REMOVENDO PERMISSES PARA UMA SOLUO DO OFFICE ...................................144 COMO: ADICIONAR CONTROLES A DOCUMENTOS DO OFFICE ...................................................................................147 COMO: EXECUTAR CLCULOS DO EXCEL POR PROGRAMAO.................................................................................149 COMO: CRIAR MENUS DO OFFICE PROGRAMATICAMENTE ...........................................................................................149 COMO: CRIAR BARRAS DE FERRAMENTAS DO OFFICE POR PROGRAMAO .............................................................150 DESENVOLVIMENTO CORPORATIVO (VISUAL C#)...........................................................................152 PROGRAMAO DO TABLET PC (VISUAL C#) ..........................................................................................152 UDIO, VDEO, JOGOS E ELEMENTOS GRFICOS (VISUAL C#) ......................................................152 CRIANDO STARTER KITS (VISUAL C#).......................................................................................................154 MIGRANDO PARA O VISUAL C#...................................................................................................................155 C# PARA DESENVOLVEDORES JAVA ............................................................................................................................155 CONVERTENDO APLICATIVOS JAVA PARA VISUAL C#.................................................................................................155 PARA DESENVOLVEDORES C++ C# .............................................................................................................................155 GUIA DE PROGRAMAO C# .........................................................................................................................158 EM UM PROGRAMA C# ................................................................................................................................................158 Hello world-seu primeiro programa (guia de programao C#)..........................................................................159 Estrutura geral de um programa C# (guia de programao C#)..........................................................................160 MAIN() E ARGUMENTOS DE LINHA DE COMANDO (GUIA DE PROGRAMAO C#) ........................................................160 ARGUMENTOS DE LINHA DE COMANDO (GUIA DE PROGRAMAO C#)........................................................................161 COMO: EXIBIR ARGUMENTOS DE LINHA DE COMANDO (GUIA DE PROGRAMAO C#) ..............................................162 COMO: ACESSAR ARGUMENTOS DE LINHA DE COMANDO USANDO FOREACH (GUIA DE PROGRAMAO C#).............163 MAIN() RETORNA VALORES (GUIA DE PROGRAMAO C#).........................................................................................163 TIPOS DE DADOS (GUIA DE PROGRAMAO C#) ..........................................................................................................164 MATRIZES (GUIA DE PROGRAMAO DO C#).....................................................................................165 MATRIZES COMO OBJETOS (GUIA DE PROGRAMAO C#) ...........................................................................................165
Visual C# Consolidado
MATRIZES MULTIDIMENSIONAIS (GUIA DE PROGRAMAO C#) ..................................................................................166 MATRIZES PASSAGEM COMO PARMETROS (GUIA DE PROGRAMAO C#)..................................................................166 PASSANDO REF USANDO MATRIZES E OUT (GUIA PROGRAMAO C#) .......................................................................168 SEQNCIAS (GUIA DE PROGRAMAO C#) ................................................................................................................169 USANDO STRINGS (GUIA DE PROGRAMAO C#) ........................................................................................................169 ESPECIFICAO DA LINGUAGEM C# ........................................................................................................173 REFERNCIA C# ....................................................................................................................................................174 PALAVRAS-CHAVE C#.................................................................................................................................................174 PALAVRA-CHAVE ABSTRACT.......................................................................................................................................174 PALAVRA-CHAVE EVENT .............................................................................................................................................177 PALAVRA-CHAVE NEW ................................................................................................................................................181 OPERADOR NEW ....................................................................................................................................................181 MODIFICADOR NEW..............................................................................................................................................184 PALAVRA-CHAVE STRUCT..................................................................................................................................186 PALAVRA-CHAVE AS............................................................................................................................................189 PALAVRA-CHAVE EXPLICIT .........................................................................................................................................190 PALAVRA-CHAVE NULL ...............................................................................................................................................191 PALAVRA-CHAVE SWITCH ...........................................................................................................................................192 PALAVRA-CHAVE BASE ...............................................................................................................................................194 PALAVRA-CHAVE EXTERN...........................................................................................................................................196 PALAVRA-CHAVE OBJECT ...........................................................................................................................................197 PALAVRA-CHAVE THIS ................................................................................................................................................198 PALAVRA-CHAVE BOOL ..............................................................................................................................................200 PALAVRA-CHAVE FALSE .............................................................................................................................................201 OPERADOR FALSE .................................................................................................................................................201 FALSE (LITERAL) ...................................................................................................................................................201 PALAVRA-CHAVE OPERATOR ......................................................................................................................................202 PALAVRA-CHAVE THROW ...........................................................................................................................................204 PALAVRA-CHAVE BREAK ............................................................................................................................................205 PALAVRA-CHAVE TRY-FINALLY ..................................................................................................................................206 PALAVRA-CHAVE OUT.................................................................................................................................................207 PALAVRA-CHAVE TRUE ...............................................................................................................................................208 OPERADOR TRUE...................................................................................................................................................208 TRUE (LITERAL) .....................................................................................................................................................208 PALAVRA-CHAVE BYTE ...............................................................................................................................................209 PALAVRA-CHAVE FIXED ..............................................................................................................................................210 PALAVRA-CHAVE OVERRIDE .......................................................................................................................................212 PALAVRA-CHAVE TRY-CATCH .....................................................................................................................................213 PALAVRA-CHAVE SWITCH ...........................................................................................................................................216 PALAVRA-CHAVE FOAT ...............................................................................................................................................218 PALAVRA-CHAVE PARAMS ..........................................................................................................................................219 PALAVRA-CHAVE TYPEOF ...........................................................................................................................................220 PALAVRA-CHAVE TRY-CATCH .....................................................................................................................................222 PALAVRA-CHAVE FOR .................................................................................................................................................225 PALAVRA-CHAVE PRIVATE ..........................................................................................................................................226 PALAVRA-CHAVE UINT................................................................................................................................................227 PALAVRA-CHAVE CHAR......................................................................................................................................228 PALAVRA-CHAVE FOREACH, IN ...................................................................................................................................228 PALAVRA-CHAVE VOLATILE .......................................................................................................................................229 PALAVRA-CHAVE DELEGATE.......................................................................................................................................230 PALAVRA-CHAVE OCK ................................................................................................................................................232 PALAVRA-CHAVE STACKALOC ....................................................................................................................................234 OPERADORES C# ..................................................................................................................................................237 OPERADORES SOBRECARREGADOS ..........................................................................................................................238 OPERADOR [ ]..............................................................................................................................................................239 OPERADOR ( )..............................................................................................................................................................240 OPERADOR . (PONTO) ..................................................................................................................................................241 OPERADOR + ...............................................................................................................................................................241 OPERADOR -................................................................................................................................................................242 OPERADOR * ...............................................................................................................................................................243
Visual C# Consolidado
OPERADOR / ................................................................................................................................................................244 OPERADOR %..............................................................................................................................................................245 OPERADOR & ..............................................................................................................................................................245 OPERADOR | ................................................................................................................................................................246 OPERADOR ^ ...............................................................................................................................................................247 OPERADOR !................................................................................................................................................................248 OPERADOR ~ ...............................................................................................................................................................248 OPERADOR = ...............................................................................................................................................................249 OPERADOR < ...............................................................................................................................................................250 OPERADOR > ...............................................................................................................................................................250 OPERADOR ?: ..............................................................................................................................................................251 OPERADOR ++.............................................................................................................................................................252 OPERADOR -- ..............................................................................................................................................................253 OPERADOR && ...........................................................................................................................................................254 DIRECTIVES PREPROCESSOR C# ................................................................................................................256 #IF (REFERNCIA C#) ..................................................................................................................................................256 #ELSE PESSOA (REFERNCIA C#) ................................................................................................................................257 #ENDIF (REFERNCIA C#)............................................................................................................................................257 # DEFINIR (REFERNCIA C#) .......................................................................................................................................258 #UNDEF (REFERNCIA C#)...........................................................................................................................................258 #WARNING (REFERNCIA C#)......................................................................................................................................258 #ERROR (REFERNCIA C#) ..........................................................................................................................................259 # LINE (REFERNCIA C#).............................................................................................................................................259 #REGION (REFERNCIA C#).........................................................................................................................................260 #ENDREGION (REFERNCIA C#)...................................................................................................................................260 # PRAGMA (REFERNCIA C#).......................................................................................................................................260 AVISO # PRAGMA (REFERNCIA C#)............................................................................................................................260 SOMA DE VERIFICAO # PRAGMA (REFERNCIA C#) .................................................................................................261 OPES DO COMPILADOR C#.......................................................................................................................262 CRIANDO DE LINHA DE COMANDO ...............................................................................................................................262 COMO CONSTRUIR A PARTIR DA LINHA DE COMANDO: ................................................................................................263 IMPLANTAO DE APLICATIVOS C# ........................................................................................................264 OPES DO COMPILADOR C# LISTADAS POR CATEGORIA ............................................................................................264 Otimizao.............................................................................................................................................................264 Arquivos de sada ..................................................................................................................................................264 Conjuntos .NET Framework..................................................................................................................................264 Erros Debugging / verificao ..............................................................................................................................265 Preprocessor .........................................................................................................................................................265 Recursos ................................................................................................................................................................265 Diversos.................................................................................................................................................................265 OPES DO COMPILADOR C# LISTADAS ALFABETICAMENTE ......................................................................................266 COMO LOCALIZAR AJUDA PARA ERROS DO COMPILADOR: ...........................................................................................267 PARA ENCONTRAR AJUDA PARA UM ERRO ..................................................................................................................267 EXEMPLOS DO VISUAL C#...............................................................................................................................268 EXEMPLO WORLD DE SAUDAO................................................................................................................................269 EXEMPLO DE PARMETROS DA LINHA DE COMANDO ...................................................................................................271 EXEMPLO MATRIZES ...................................................................................................................................................272 EXEMPLO PROPRIEDADES ............................................................................................................................................272 EXEMPLO BIBLIOTECAS ...............................................................................................................................................273 EXEMPLO DE VERSO ..................................................................................................................................................274 COLEO EXEMPLO CLASSES .....................................................................................................................................275 EXEMPLO STRUCTS .....................................................................................................................................................276 EXEMPLO INDEXADORES .............................................................................................................................................277 INDEXADO EXEMPLO PROPRIEDADES ..........................................................................................................................278 EXEMPLO CONVERSIONS DEFINIDAS PELO USURIO ...................................................................................................279 EXEMPLO GENERICS (C#)............................................................................................................................................279 EXEMPLO REPRESENTANTES .......................................................................................................................................281 EXEMPLO EVENTOS .....................................................................................................................................................282
Visual C# Consolidado
EXEMPLO DE IMPLEMENTAO DE INTERFACE EXPLCITA ..........................................................................................283 EXEMPLO DOS MTODOS CONDICIONAL .....................................................................................................................284 EXEMPLO DE DOCUMENTAO XML..........................................................................................................................285 PLATAFORMA INVOKE EXEMPLO ................................................................................................................................286 EXEMPLO PARTE 1 INTEROP COM ..............................................................................................................................287 EXEMPLO PARTE 2 INTEROP COM ..............................................................................................................................288 EXEMPLO ATRIBUTOS..................................................................................................................................................289 EXEMPLO DE SEGURANA ...........................................................................................................................................290 SEGMENTAO DE EXEMPLO ......................................................................................................................................291 EXEMPLO DE CDIGO NO SEGUROS ...........................................................................................................................292 EXEMPLO BD OLE .....................................................................................................................................................293 PRODUZIR EXEMPLO ...................................................................................................................................................294 ANNIMO EXEMPLO REPRESENTANTES .......................................................................................................................295 EXEMPLO TIPOS PARCIAL ............................................................................................................................................296 EXEMPLO ANULVEL ..................................................................................................................................................296 TERMINOLOGIA C# .............................................................................................................................................298 EXEMPLOS DO VISUAL C#...............................................................................................................................301 EXEMPLO WORLD DE SAUDAO................................................................................................................................303 EXEMPLO DE PARMETROS DA LINHA DE COMANDO ...................................................................................................304 EXEMPLO MATRIZES ...................................................................................................................................................305 EXEMPLO PROPRIEDADES ............................................................................................................................................306 EXEMPLO BIBLIOTECAS ...............................................................................................................................................307 EXEMPLO DE VERSO ..................................................................................................................................................308 COLEO EXEMPLO CLASSES .....................................................................................................................................309 EXEMPLO STRUCTS .....................................................................................................................................................310 EXEMPLO INDEXADORES .............................................................................................................................................311 INDEXADO EXEMPLO PROPRIEDADES ..........................................................................................................................311 EXEMPLO CONVERSIONS DEFINIDAS PELO USURIO ...................................................................................................312 EXEMPLO GENERICS (C#)............................................................................................................................................313 EXEMPLO OVERLOADING DO OPERADOR ....................................................................................................................314 EXEMPLO REPRESENTANTES .......................................................................................................................................315 EXEMPLO EVENTOS .....................................................................................................................................................316 EXEMPLO DE IMPLEMENTAO DE INTERFACE EXPLCITA ..........................................................................................317 EXEMPLO DOS MTODOS CONDICIONAL .....................................................................................................................318 EXEMPLO DE DOCUMENTAO XML..........................................................................................................................318 PLATAFORMA INVOKE EXEMPLO ................................................................................................................................319 EXEMPLO PARTE 1 INTEROP COM ..............................................................................................................................320 EXEMPLO PARTE 2 INTEROP COM ..............................................................................................................................322 EXEMPLO ATRIBUTOS..................................................................................................................................................323 EXEMPLO DE SEGURANA ...........................................................................................................................................324 SEGMENTAO DE EXEMPLO ......................................................................................................................................325 EXEMPLO DE CDIGO NO SEGUROS ...........................................................................................................................326 EXEMPLO BD OLE .....................................................................................................................................................327 PRODUZIR EXEMPLO ...................................................................................................................................................328 ANNIMO EXEMPLO REPRESENTANTES .......................................................................................................................328 EXEMPLO TIPOS PARCIAL ............................................................................................................................................329 EXEMPLO ANULVEL ..................................................................................................................................................330 COMO FAZER EM C#................................................................................................................................................332 LINGUAGEM C# (COMO EU FAO EM C#).........................................................................................................334 O QUE H DE NOVO NA C# 2.0 IDIOMA E COMPILER ....................................................................................................340 Usando Starter Kits C# .........................................................................................................................................340 Especificao da Linguagem C# ...........................................................................................................................341 Main() e argumentos de linha de comando (Guia de programao C#)...............................................................341 Main() retorna valores (Guia de programao C#)..............................................................................................343 base (Referncia do C#) ........................................................................................................................................343 Construtores de instncia (Guia de programao C#) .........................................................................................345 CLASSES GENRICAS NO .NET FRAMEWORK ..............................................................................................................357 Viso geral sobre Generics no .NET Framework..................................................................................................357 Tipos e Generics aninhadas ..................................................................................................................................358 System.Collections.Generic ...................................................................................................................................359
Visual C# Consolidado
System.Collections.ObjectModel ...........................................................................................................................359 O encadeamento representantes............................................................................................................................361 Igualdade e classificao Comparisons ................................................................................................................361 Funcionalidade coleo ........................................................................................................................................361 Vantagens de Generics ..........................................................................................................................................362 A palavra-chave default em cdigo fonte "genrico" (Guia de programao C#) ...............................................363 Mtodos genrico (Guia de programao C#)......................................................................................................363 Restries em parmetros de tipo (Guia de programao C#) .............................................................................365 Representantes genricos (Guia de programao C#)..........................................................................................367 Uma tabela imposto exemplo ................................................................................................................................375 Criar um suplemento de automao para Excel usando o Visual Studio e cdigo gerenciado ............................375 Executar o suplemento do Excel............................................................................................................................376 Executar cdigo em outro domnio de aplicao (Guia de programao C#)......................................................392 Exemplos do Visual C#..........................................................................................................................................394 .NET FRAMEWORK (COMO FAZER EM C#).......................................................................................................397 INTRODUO LINGUAGEM C# E AO .NET FRAMEWORK ..........................................................................................408 Viso geral sobre o .NET Framework...................................................................................................................410 Viso Geral Conceitual Sobre o .NET Framework ...............................................................................................410 COMMON LANGUAGE RUNTIME ..................................................................................................................................416 Viso geral do Common Language Runtime .........................................................................................................416 Gerenciamento automtico de memria................................................................................................................417 CTS (Common Type System) .................................................................................................................................420 Viso Geral do CTS (Common Type System) ........................................................................................................420 Definies de Tipo.................................................................................................................................................422 Membros de Tipos .................................................................................................................................................424 Tipos de valor no Common Type System...............................................................................................................426 Classes no Common Type System..........................................................................................................................427 Delegados no Common Type System.....................................................................................................................428 Matrizes em Common Type System .......................................................................................................................430 Interfaces no Common Type System ......................................................................................................................431 Ponteiros no Common Type System (CTS) ............................................................................................................431 OS METADADOS E OS COMPONENTES AUTODESCRITIVOS ............................................................................................433 Viso Geral Sobre Metadados...............................................................................................................................433 Estrutura e uso de metadados ...............................................................................................................................434 Metadados e Estrutura do Arquivos PE ................................................................................................................434 Uso de metadados em tempo de execuo.............................................................................................................435 ASSEMBLIES NO COMMON LANGUAGE RUNTIME........................................................................................................436 Viso Geral Sobre Assemblies...............................................................................................................................437 Benefcios do Assembly .........................................................................................................................................438 Sumrio de assembly .............................................................................................................................................439 Manifesto do Assembly ..........................................................................................................................................440 Cache Global de Assemblies .................................................................................................................................442 Assemblies de Nomes Fortes .................................................................................................................................443 Consideraes sobre segurana de assemblies .....................................................................................................443 Versionamento de Assembly ..................................................................................................................................445 Nmero de Verso do Assembly ............................................................................................................................446 Verso Informativa do Assembly ...........................................................................................................................447 Posicionamento do Assembly ................................................................................................................................447 Assemblies e execuo lado a lado........................................................................................................................448 Viso Geral da Biblioteca de Classes do .NET Framework..................................................................................448 Localizador rpido de tecnologia..........................................................................................................................451 Criando Novas Seqncias de Caracteres.............................................................................................................458 Aparando e Removendo Caracteres ......................................................................................................................460 Preenchendo Seqncias de Caracteres................................................................................................................461 Comparando Seqncias de Caracteres................................................................................................................462 Alterando a Caixa..................................................................................................................................................466 Usando a Classe StringBuilder .............................................................................................................................467 Acrescentar............................................................................................................................................................468 Colees e Estruturas de Dados............................................................................................................................472 Definir colees.....................................................................................................................................................472 Comumente usados tipos da coleo.....................................................................................................................474 Colees de bits.....................................................................................................................................................474
Visual C# Consolidado
Colees especializados ........................................................................................................................................475 Criando e Manipulating colees..........................................................................................................................475 Selecionando uma Classe de Coleo ...................................................................................................................476 Enumerar uma coleo..........................................................................................................................................477 Colees e sincronizao (segurana do segmento) .............................................................................................478 Comparaes e classifica em colees..................................................................................................................478 Quando Usar Colees Genricas ........................................................................................................................479 Classe genrica List ..............................................................................................................................................480 Consideraes sobre desempenho.........................................................................................................................481 Classe genrica SortedDictionary.........................................................................................................................483 DEPURAO (COMO FAZER EM C#) ............................................................................................................................495 Compilando no Visual Studio ................................................................................................................................495 Compilao Durante o Desenvolvimento de Aplicativos ......................................................................................495 Configuraes de Compilao ..............................................................................................................................496 Compilar plataformas ...........................................................................................................................................498 Compilar elementos de interface do usurio.........................................................................................................504 Caixa de Dilogo Batch Build...............................................................................................................................504 Janela de sada ......................................................................................................................................................506 Caixa de Dilogo Configuration Manager............................................................................................................507 Depurao no Visual Studio..................................................................................................................................508 O que h de novo no depurador Visual Studio 2005 .............................................................................................508 Segurana do Depurador ......................................................................................................................................511 Segurana de Depurao Gerenciada...................................................................................................................511 Segurana em Depurao Remota ........................................................................................................................511 Segurana de Depurao de Servios da Web ......................................................................................................512 Componentes Externos ..........................................................................................................................................512 Smbolos e Cdigo Fonte.......................................................................................................................................512 Preparao e configuraes de depurao ...........................................................................................................512 Configuraes do Projeto do Depurador ..............................................................................................................513 Requisitos de software depurao SQL.................................................................................................................513 Configuraes do projeto para um C++ depurar configurao...........................................................................515 Como definir permisses SQL Server para depurao: ........................................................................................518 Configuraes do projeto para uma configurao de depurao no Visual Basic ...............................................519 Arquivos PDB (C++) ............................................................................................................................................521 Arquivos DBG .......................................................................................................................................................521 Instalando smbolos para sistema de depurao chamada Crashes .....................................................................522 Depurao de projetos DLL ..................................................................................................................................523 Preparao da depurao: Projetos de console ...................................................................................................526 Preparao de Depurao: Tipos de Projeto do Visual C++ ..............................................................................526 Preparao da Depurao: Configuraes de Propriedades Recomendveis .....................................................527 Depurao preparao: Applications formulrios Windows (.NET)....................................................................527 Projetos Win32 depurao preparao: ...............................................................................................................528 Preparao da Depurao: Web Services XML (C++)........................................................................................529 Preparao para depurao: tipos de projeto C#, J# e Visual Basic ...................................................................529 Aplicativos da Web depurao preparao: .........................................................................................................529 Preparao para depurao : Aplicativos ASP.NET da Web ...............................................................................530 Projetos Servio da Web XML depurao preparao:........................................................................................530 Preparao para depurao: Servios da Web ATL Server..................................................................................532 Preparao para depurao: Projetos ATL Server ..............................................................................................532 Instalao de depurao remota ...........................................................................................................................533 Depurao na uma plataforma de 64 bits .............................................................................................................539 Depurao e o processo Hosting...........................................................................................................................540 Explicao detalhada sobre o depurador..............................................................................................................542 Depurando o cdigo gerenciado ...........................................................................................................................542 Diagnstico de mensagens na janela de sada ......................................................................................................542 Assero no cdigo gerenciado.............................................................................................................................543 Parar instrues no Visual Basic ..........................................................................................................................546 Depurar o mtodo OnStart como: .........................................................................................................................549 Depurao de cdigo nativo..................................................................................................................................551 Como debug otimizado cdigo: .............................................................................................................................551 DebugBreak e __debugbreak ................................................................................................................................553 Declaraes...........................................................................................................................................................553 _DEBUG ...............................................................................................................................................................554
Visual C# Consolidado
Deteco vazamento de memria e isolamento.....................................................................................................555 Para depurar cdigo de montagem embutido .......................................................................................................556 Tcnicas de depurao atl.....................................................................................................................................556 Tcnicas de depurao MFC.................................................................................................................................557 Tcnicas de depurao CRT..................................................................................................................................558 Depurao Native FAQs do cdigo.......................................................................................................................559 COM e depurando ActiveX....................................................................................................................................560 Depurar aplicativos da Web..................................................................................................................................562 Depurao SQL .....................................................................................................................................................563 Depurao referncia Interface de usurio...........................................................................................................564 Aperfeioando a depurao com o atributo de exibio do depurador ................................................................573 Descrio...............................................................................................................................................................575 Cdigo ...................................................................................................................................................................575 Para criar o formulrio do Windows para essa explicao passo a passo...........................................................579 Para anexar ao formulrio do Windows para depurao.....................................................................................581 Banco de dados de depurao T-SQL ...................................................................................................................590 SEGURANA (COMO FAZER EM C#) ............................................................................................................................596 Segurana no Visual Studio...................................................................................................................................596 Noes Bsicas sobre Segurana de Accesso a Cdigo........................................................................................596 Prticas recomendadas de poltica de segurana .................................................................................................597 Viso geral da administrao de poltica de segurana .......................................................................................597 Administrao de diretiva de segurana geral......................................................................................................599 Determinando quando para modificar a diretiva de segurana............................................................................599 Ferramentas de administrao..............................................................................................................................600 Aumentar permisses.............................................................................................................................................601 Administrao com atributos Grupo de cdigos ...................................................................................................602 Dicas de administrao.........................................................................................................................................603 Administrao de diretiva corporativa..................................................................................................................604 Administrao de diretiva da mquina..................................................................................................................604 Administrao de diretiva de usurio....................................................................................................................604 EXPLICAES PASSO-A-PASSO DO .NET FRAMEWORK SDK ......................................................................................719 Como Registrar Assemblies de Interoperabilidade Primrios ..............................................................................784 Como Empacotar Vrias Verses de Bibliotecas de Tipos ...................................................................................785 APLICATIVOS DO WINDOWS (COMO FAZER EM C#) ....................................................................................................786 Componente Timer (Windows Forms)...................................................................................................................797 Viso geral do componente de timer (Windows Forms)........................................................................................797 Limitaes do componente Timer de formulrios do Windows na propriedade Interval......................................798 Controle toolBar Windows (formulrios)..............................................................................................................800 Viso geral sobre de controle toolBar (formulrios do Windows)........................................................................800 Como adicionar botes a um controle ToolBar usando o criador:.......................................................................801 PGINAS DA WEB E SERVIOS DA WEB (COMO FAZER EM C#)................................................................806 O que h de novo no desenvolvimento para Web no Visual Studio.......................................................................806 Servidor de Desenvolvimento do ASP.NET ...........................................................................................................807 Publicao de Web Sites .......................................................................................................................................808 Extensibilidade de Controle ..................................................................................................................................811 Ligao de Dados com Controles de Fonte de Dados ..........................................................................................812 Controles de dados avanados ..............................................................................................................................812 Vinculao bidirecional de dados .........................................................................................................................813 Armazenamento de seqncia de caracteres de conexo ......................................................................................813 Acesso a dados em duas e trs camadas ...............................................................................................................813 Compatibilidade com Verses Anteriores para Acesso a Dados ..........................................................................814 INTRODUO A PGINAS DA WEB DO ASP.NET.........................................................................................................815 Postagem cruzada de pginas ...............................................................................................................................816 Preservando o estado da pgina ...........................................................................................................................816 Controles de servidor ............................................................................................................................................817 Compatibilidade do navegador .............................................................................................................................818 Documentos e dados XML.....................................................................................................................................818 O que h de novo no System.Xml ..........................................................................................................................818 Migrando de verso 1.1 das classes XML .............................................................................................................819 Arquitetura Overview of XML no .NET Framework .............................................................................................822 Segurana e seus aplicativos System.Xml .............................................................................................................822 Consideraes sobre segurana System.Xml.........................................................................................................823
Visual C# Consolidado
Processamento DTD..............................................................................................................................................824 Processamento de esquema ...................................................................................................................................824 Recursos externos..................................................................................................................................................824 Compartilhar objetos XmlReaderSettings .............................................................................................................825 Suporte componentes.............................................................................................................................................825 Processamento de dados .......................................................................................................................................825 Processamento DTD..............................................................................................................................................825 Tratamento de entidade .........................................................................................................................................825 Recursos externos..................................................................................................................................................825 Recursos externos..................................................................................................................................................826 Blocos de script .....................................................................................................................................................826 Objetos de extenso...............................................................................................................................................826 System.Xml codificao diretrizes .........................................................................................................................827 Acesso externo .......................................................................................................................................................827 Negao de Servio ...............................................................................................................................................827 Processamento.......................................................................................................................................................828 Dados XML processo In-Memory..........................................................................................................................829 Processo dados XML usando o modelo DOM.......................................................................................................829 Processo dados XML usando o modelo de dados XPath.......................................................................................830 Lendo XML com o XmlReader...............................................................................................................................831 Escrevendo XML com o XmlWriter .......................................................................................................................832 Novos recursos na classe XmlWriter.....................................................................................................................832 Verificao de caracteres......................................................................................................................................833 Verificando a conformidade ..................................................................................................................................833 Usando o XmlWriter..............................................................................................................................................833 Transformaes em XSLT......................................................................................................................................834 Usando a classe XslCompiledTransform...............................................................................................................834 Migrando da classe XslTransform ........................................................................................................................835 Consideraes sobre segurana XSLT ..................................................................................................................837 Transformaes em XSLT com a classe XslTransform..........................................................................................839 Modelo de objeto de esquema (SOM) do XML......................................................................................................841 Viso geral do modelo de objeto do esquema XML ..............................................................................................841 Leitura e escrita esquemas XML ...........................................................................................................................843 Criando esquemas XML ........................................................................................................................................844 Atravessando esquemas XML................................................................................................................................847 Editar Esquemas XML...........................................................................................................................................849 Incluindo ou importar esquemas XML ..................................................................................................................853 Integrao XML com dados relacional e ADO.NET .............................................................................................855 Resolver externos recursos XML nomeados por um URI......................................................................................857 Resolvendo recursos usando o XmlResolver .........................................................................................................857 Fornecer credenciais de autenticao para XmlResolver quando leitura de um arquivo ....................................858 Para criar um objeto XmlReader que usa um XmlSecureResolver .......................................................................860 Codificao de caracteres de nomes XML e converso de tipos de dados XML...................................................860 Espaos para nomes em um documento XML .......................................................................................................860 Suporte tipo nas classes System.Xml .....................................................................................................................861 Mapear tipos de dados XML para tipos CLR ........................................................................................................861 Observaes de implementao de suporte tipo XML...........................................................................................863 Converso de tipos de dados XML ........................................................................................................................864 SERVIOS DA WEB XML NO CDIGO GERENCIADO ....................................................................................................866 Introduo programao servios XML da Web no cdigo gerenciado ............................................................866 Programao na Web com XML Web Services .....................................................................................................867 Criando XML Web Services em cdigo gerenciado ..............................................................................................867 Acessando XML Web Services no cdigo gerenciado ...........................................................................................869 Criado usando clientes do servio XML da Web ASP.NET e Servios XML da Web ...........................................870 Acessar a Pgina de Ajuda de Servio ..................................................................................................................878 Acessar a descrio de servio..............................................................................................................................878 Fornecendo um nome de mensagem para um mtodo de XML Web Service ........................................................883 Criando uma nova transao com um mtodo de XML Web Service....................................................................884 Protegendo Servios da Web XML Criados Usando ASP.NET.............................................................................895 ACESSO A DADOS (COMO FAZER EM C#) ....................................................................................................................900 Criando os controles para exibir os pedidos para cada cliente (registros filho) ..................................................902 Viso geral sobre como conectar-se a dados no Visual Studio.............................................................................903 Viso Geral do Adaptador de Tabela....................................................................................................................921
Visual C# Consolidado
10
Viso Geral do Preenchimento de DataSets e Consultas de Dados......................................................................927 Viso Geral da Exibio dados .............................................................................................................................936 Ligao de Objeto no Visual Studio ......................................................................................................................962 Viso Geral da Edio de dados em DataSets ......................................................................................................966 Viso geral sobre validao de dados...................................................................................................................967 Viso Geral do Salvar dados.................................................................................................................................972 Introduo ao CONCURRENCY dados em ADO.NET .........................................................................................982 CONCURRENCY pessimista.................................................................................................................................982 CONCURRENCY otimista.....................................................................................................................................983 ltima no WINS.....................................................................................................................................................983 A abordagem nmero verso.................................................................................................................................984 Para adicionar o tratamento de erro para o erro de concorrncia ......................................................................989 Elementos de Dados de Interface de Usurio .......................................................................................................994 Adaptadores de Dados do ADO.NET ....................................................................................................................997 Projetos SQL Server ..............................................................................................................................................998 CRIANDO CLASSES (COMO FAZER EM C#) ................................................................................................................1004 COMO: Criar Tipos em Diagramas de Classe ...................................................................................................1004 Criando e Configurando Membros de Tipos .......................................................................................................1005 Criar membros tipo .............................................................................................................................................1005 COMO: Modificar membros de tipo....................................................................................................................1006 COMO: Adicionar um parmetro a um mtodo..................................................................................................1006 COMO: Abrir a janela Class Details ..................................................................................................................1007 Atalhos de teclado para a janela Detalhes de classe ..........................................................................................1007 Usando o teclado.................................................................................................................................................1008 Observaes teis sobre a janela Class Details ..................................................................................................1009 Exibio de informaes somente leitura............................................................................................................1010 Elementos da janela Class Details ......................................................................................................................1011 Linhas membro ....................................................................................................................................................1011 Linhas de parmetro............................................................................................................................................1012 COMO: Herdar de um Tipo Genrico.................................................................................................................1012 COMO: Definir herana entre tipos....................................................................................................................1013 COMO: Definir associaes entre tipos..............................................................................................................1013 COMO: Excluir formas de tipos e cdigo associado de diagramas classe.........................................................1014 COMO: Aplicar atributos personalizados a tipos ou membros de tipo...............................................................1015 COMO: Exibir Herana entre Tipos ...................................................................................................................1015 COMO: Exibir tipos derivados............................................................................................................................1016 COMO: Remover formas de tipos de diagramas de classe .................................................................................1016 COMO: Exibir compartimentos em formas de tipo.............................................................................................1017 COMO: Exibir detalhes do tipo: .........................................................................................................................1018 COMO: Alternar entre notao de membro e notao de associao................................................................1019 COMO: Exibir membros de tipo .........................................................................................................................1019 COMO: Adicionar diagramas de classes a projetos ...........................................................................................1020 COMO: Exibir tipos existentes............................................................................................................................1021 Ententendo um cdigo que voc no escreveu ....................................................................................................1022 COMO: Agrupar membros de tipo ......................................................................................................................1022 COMO: Adicionar comentrios a diagramas de classe ......................................................................................1022 Personalizando diagramas de classe...................................................................................................................1023 COMO: Copiar elementos de diagrama de classe para um documento do Microsoft Office .............................1024 COMO: Imprimir diagramas de classe ...............................................................................................................1024 COMO: Ignorar membros de tipo .......................................................................................................................1025 COMO: Renomear tipos e membros de tipo........................................................................................................1025 COMO: Mover um membro de tipo de um tipo para outro .................................................................................1026 COMO: Implementar uma interface....................................................................................................................1026 COMO: Implementar uma classe abstrata..........................................................................................................1027 COMO: Extrair para interface (C# somente)......................................................................................................1027 COMO: Reordenar parmetros (C# somente) ....................................................................................................1027 COMO: Criar um membro ..................................................................................................................................1027 COMO: Implementar um designer para um controle..........................................................................................1029 COMO: Criar e configurar componentes no modo Design.................................................................................1030 Como: Acessar suporte em tempo de design no Windows Forms .......................................................................1036 COMO: Implementar um provedor Extender HelpLabel ....................................................................................1037 COMO: Acessar servios em tempo de criao ..................................................................................................1041 COMO: Serializar colees de tipos padro com o DesignerSerializationVisibilityAttribute............................1048
Visual C# Consolidado
11
Como: Executar inicializao personalizada para controles no modo de design...............................................1049 COMO: Implementar um conversor de tipo ........................................................................................................1050 Para implementar um conversor de tipo simples que pode converter uma seqncia para um ponto................1050 Para implementar um conversor de tipo simples que fornece uma lista drop-down de valores padro em um navegador Propriedade.......................................................................................................................................1051 Para implementar um conversor tipo que produz Propriedade baseado no construtor-cdigo de inicializao1053 COMO: Implementar um editor UI de tipo .........................................................................................................1054 Como: Estender a aparncia e comportamento de controles no modo de design...............................................1055 COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao..1064 COMO: Anexar marcas inteligentes para um componente de formulrios do Windows ....................................1071 COMO: Ajustar atributos, eventos e propriedades de um componente no modo Design ...................................1073 PROGRAMAO DO OFFICE (COMO FAZER EM C#) ...................................................................................................1080 Como: Atualizar solues das Ferramentas do Visual Studio para o Office ......................................................1080 O Excel Usando Explicaes Passo-a-passo.......................................................................................................1081 Coleta de dados usando um formulrio do Windows Walkthrough: ...................................................................1081 Para criar um novo projeto .................................................................................................................................1081 Para adicionar um intervalo nomeado para Sheet1............................................................................................1081 Para adicionar um formulrio do Windows ........................................................................................................1082 Para exibir o formulrio e coletar informaes..................................................................................................1082 Para enviar informaes para a planilha ...........................................................................................................1083 Para testar sua pasta de trabalho .......................................................................................................................1083 Alterando planilha formatao usando controles CheckBox Walkthrough: .......................................................1083 Para criar um novo projeto .................................................................................................................................1084 Para adicionar trs caixas de seleo.................................................................................................................1084 Para adicionar texto a um controle NamedRange ..............................................................................................1085 Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough: ..................................1086 Para testar sua pasta de trabalho .......................................................................................................................1088 Programao contra eventos de um controle NamedRange Walkthrough: ........................................................1088 Walkthrough: vinculao clulas para vrias colunas em uma tabela ...............................................................1099 Criando uma relao mestre / detalhes usando um DataSet em cache Walkthrough:........................................1103 Para criar um novo projeto .................................................................................................................................1104 Armazenar em cache DataSet..............................................................................................................................1105 Para percorrer os registros.................................................................................................................................1106 Para testar o cache de dados ..............................................................................................................................1106 Para adicionar os dados .....................................................................................................................................1107 Para adicionar um grfico ..................................................................................................................................1108 Para criar um novo projeto .................................................................................................................................1108 Para alterar o nome do controle grfico.............................................................................................................1109 Para adicionar um controle de usurio...............................................................................................................1109 Para adicionar controles Windows Form ao controle de usurio ......................................................................1109 Para criar um evento e propriedade em um controle de usurio........................................................................1110 Para manipular o evento CheckedChanged dos botes de opo.......................................................................1110 Para adicionar o controle do usurio sua planilha ............................................................................................1111 Para alterar o tipo de grfico que exibido na planilha ....................................................................................1111 Para testar sua pasta de trabalho .......................................................................................................................1112 Vinculao de Dados para controles em um painel Aes do Excel Walkthrough:............................................1112 Para criar um novo projeto .................................................................................................................................1113 Para adicionar uma nova fonte de dados para o projeto....................................................................................1113 Para adicionar um NamedRange e um controle ListObject ................................................................................1114 Para adicionar um controle painel Aes ...........................................................................................................1114 Para adicionar controles Windows Forms ligados a dados a um controle painel Aes ...................................1114 Para definir propriedades de vinculao de dados do controle..........................................................................1115 Para mostrar o painel Aes ...............................................................................................................................1115 Para testar seu documento ..................................................................................................................................1115 Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough: .........................1116 Para criar um novo projeto .................................................................................................................................1117 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1117 Para publicar a soluo ......................................................................................................................................1117 Para atualizar o manifesto do aplicativo incorporado........................................................................................1118 Para atualizar a manifesto de implantao.........................................................................................................1119 Para atualizar o manifesto do aplicativo externo ...............................................................................................1119 Para copiar os arquivos de soluo para o servidor ..........................................................................................1120 Para conceder confiana total para a pasta de rede...........................................................................................1120
Visual C# Consolidado
12
Para testar a implantao ...................................................................................................................................1120 Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough: .............1121 Para criar um novo projeto .................................................................................................................................1122 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1122 Para criar um projeto de instalao para a soluo...........................................................................................1122 Para adicionar o documento e conjunto ao projeto de instalao......................................................................1123 Para criar um projeto ao personalizada..........................................................................................................1123 Para criar uma ao personalizada que edita o manifesto do aplicativo ...........................................................1124 Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao................................1125 Para testar a instalao ......................................................................................................................................1125 Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office ..........................................1126 Para criar um novo projeto .................................................................................................................................1126 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1126 Para remover um grupo de cdigos ....................................................................................................................1127 Para criar um nome forte ....................................................................................................................................1128 Para conceder confiana com base em nome forte .............................................................................................1128 Para testar sua pasta de trabalho .......................................................................................................................1128 O Word Usando Explicaes Passo-a-passo.......................................................................................................1129 Walkthrough: Changing Document formatao usando controles CheckBox ....................................................1129 Para criar um novo projeto .................................................................................................................................1129 Para adicionar trs caixas de seleo.................................................................................................................1130 Para adicionar texto e um controle indicador.....................................................................................................1130 Para alterar a formatao quando uma caixa de seleo marcada.................................................................1131 Para testar seu documento ..................................................................................................................................1132 Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough: ................................1132 Para criar um novo projeto .................................................................................................................................1133 Para adicionar um boto e uma caixa de texto ...................................................................................................1133 Para escrever para a caixa de texto quando o boto clicado...........................................................................1133 Para testar seu documento ..................................................................................................................................1134 Walkthrough: Criando menus de atalho para indicadores .................................................................................1134 Para criar um novo projeto .................................................................................................................................1135 Para adicionar texto ao seu documento ..............................................................................................................1135 Para adicionar um controle indicador ao seu documento ..................................................................................1135 Para criar o menu de atalho................................................................................................................................1135 Para formatar o texto contido no indicador........................................................................................................1136 Para testar seu documento ..................................................................................................................................1137 Walkthrough: atualizando um grfico em um documento usando botes de opo............................................1137 Para criar um novo projeto .................................................................................................................................1138 Para adicionar um grfico ..................................................................................................................................1138 Para adicionar um controle de usurio...............................................................................................................1139 Para adicionar controles Windows Form ao controle de usurio ......................................................................1139 Para adicionar uma referncia 11.0 biblioteca objeto do Graph Microsoft ....................................................1140 Para criar um evento e propriedade em um controle de usurio........................................................................1140 Para manipular o evento CheckedChange dos botes de opo.........................................................................1140 Para adicionar o controle de usurio do documento ..........................................................................................1141 Para alterar o tipo de grfico que exibido no documento ................................................................................1141 Para testar seu documento ..................................................................................................................................1142 Vinculao de Dados para controles em um painel Aes do Word Walkthrough:............................................1142 Para criar um novo projeto .................................................................................................................................1143 Para adicionar um controle painel Aes ...........................................................................................................1143 Para adicionar uma nova fonte de dados para o projeto....................................................................................1143 Para adicionar controles Windows Forms ligados a dados a um controle painel Aes ...................................1144 Para carregar o controle com dados...................................................................................................................1145 Para definir propriedades de vinculao de dados do controle..........................................................................1145 Para formatar os ttulos de tabela.......................................................................................................................1145 Para criar a tabela ..............................................................................................................................................1146 Para inserir texto em uma tabela do Word..........................................................................................................1146 Para mostrar o painel Aes ...............................................................................................................................1147 Para testar seu documento ..................................................................................................................................1147 Walkthrough: criar uma marca inteligente que converte Temperatures de Fahrenheit para Celsius ................1148 Para criar um novo projeto .................................................................................................................................1148 Para configurar seu projeto ................................................................................................................................1148 Para criar a marca inteligente ............................................................................................................................1149
Visual C# Consolidado
13
Para criar o manipulador de eventos..................................................................................................................1149 Para testar sua pasta de trabalho .......................................................................................................................1150 Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough: .........................1150 Para criar um novo projeto .................................................................................................................................1151 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1151 Para publicar a soluo ......................................................................................................................................1152 Para atualizar o manifesto do aplicativo incorporado........................................................................................1152 Para atualizar a manifesto de implantao.........................................................................................................1153 Para atualizar o manifesto do aplicativo externo ...............................................................................................1153 Para copiar os arquivos de soluo para o servidor ..........................................................................................1154 Para conceder confiana total para a pasta de rede...........................................................................................1154 Para testar a implantao ...................................................................................................................................1154 Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough: .............1155 Para criar um novo projeto .................................................................................................................................1156 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1156 Para criar um projeto de instalao para a soluo...........................................................................................1156 Para adicionar o documento e conjunto ao projeto de instalao......................................................................1157 Para criar um projeto ao personalizada..........................................................................................................1157 Para criar uma ao personalizada que edita o manifesto do aplicativo ...........................................................1158 Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao................................1159 Para testar a instalao ......................................................................................................................................1159 Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office ..........................................1160 Para criar um novo projeto .................................................................................................................................1160 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1160 Para remover um grupo de cdigos ....................................................................................................................1161 Para criar um nome forte ....................................................................................................................................1162 Para conceder confiana com base em nome forte .............................................................................................1162 Para testar sua pasta de trabalho .......................................................................................................................1162 COMO: Adicionar Controles a Documentos do Office.......................................................................................1162 Para arrastar um Windows Forms controle para o documento..........................................................................1163 Para desenhar um Windows Forms controle sobre o documento .......................................................................1163 Para adicionar um controle Windows Forms para o documento clicando uma nica vez sobre o controle ......1164 Para adicionar um controle Windows Forms para o documento clicando duas vezes no controle ....................1164 Para adicionar um controle Windows Forms para o documento, pressionando a tecla ENTER........................1164 Para adicionar um Windows Forms controlar programaticamente ...................................................................1165 COMO: Executar Clculos do Excel por Programao .....................................................................................1165 Para executar clculos em um controle NamedRange ........................................................................................1165 Executar clculos para o aplicativo inteiro ........................................................................................................1165 Para executar clculos em todas as pastas de trabalho abertas.........................................................................1165 Como: Criar menus do Office programaticamente .............................................................................................1166 COMO: Criar Barras de Ferramentas do Office por Programao...................................................................1167 DISPOSITIVOS INTELIGENTES ....................................................................................................................................1168 O que h de novo em projetos Smart Device.......................................................................................................1168 O que h de novo no desenvolvimento visual aplicativos dispositivos C++.......................................................1168 Destino vrios sistemas operacionais .................................................................................................................1168 Sistema do projeto ...............................................................................................................................................1168 O IntelliSense ......................................................................................................................................................1168 Modo misto Solutions ..........................................................................................................................................1168 Instalar do aplicativo ..........................................................................................................................................1168 Aplicativos personalizados e assistentes de classe..............................................................................................1168 Editor de recursos ...............................................................................................................................................1169 ATL ......................................................................................................................................................................1169 MFC ....................................................................................................................................................................1170 O que h de novo no Managed projetos de dispositivo .......................................................................................1170 Como Iniciar o Emulador de Dispositivo no Visual Studio.................................................................................1171 Viso geral do acesso de dados (projetos do dispositivo gerenciado) ................................................................1172 Viso geral Solutions do dispositivo de embalagem ...........................................................................................1173 Alternar plataformas em projetos de dispositivo.................................................................................................1174 Ferramentas Remotas para Projetos de Dispositivos .........................................................................................1174 Viso geral sobre segurana (dispositivos).........................................................................................................1175 Seleo mtodo de conexo.................................................................................................................................1176 Atualizando Projetos Criados com Ferramentas Anterior..................................................................................1178 Selecionando uma Linguagem de Desenvolvimento............................................................................................1179
Visual C# Consolidado
14
Programao para Dispositivos usando o .NET Compact Framework ..............................................................1182 Referncia do .NET Compact Framework para Projetos de Dispositivos ..........................................................1183 Gerenciando Trechos de Cdigo em Projetos Dispositivos ................................................................................1186 Diferenas entre depuradores de dispositivos e de desktop ................................................................................1194 IMPLANTAO (COMO FAZER EM C#) .......................................................................................................................1235
Visual C# Consolidado
15
VISUAL C#
Microsoft Visual C# 2005, pronunciado C sharp, uma linguagem de programao projetada para criar uma ampla variedade de aplicativos executados no .NET Framework. C# simples, poderoso, com segurana de tipos, e orientada a objetos. Com suas muitas inovaes, C# permite o desenvolvimento rpido de aplicativos mantendo a expressividade e elegncia das linguagens do estilo C. Visual Studio oferece suporte ao Visual C# com um editor de cdigos completo, modelos de projeto, designers, assistentes de cdigo, depurador poderoso e de fcil uso, e outras ferramentas. A biblioteca de classes do .NET Framework fornece acesso a uma grande variedade de servios do sistema operacional e outras classes teis, e bem estruturadas que aceleram o ciclo de desenvolvimento significativamente.
Nesta seo
Guia de Introduo ao Visual C#
Apresenta os recursos do C# 2.0 para programadores novos para a linguagem ou novos para o Visual Studio, e fornece um roadmap para encontrar ajuda no Visual Studio. Isso tambm est localizado nas pginas "Como Fazer".
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
Visual C# Consolidado
17
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".
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 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.
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
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#.
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.
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.
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.
Visual C# Consolidado
25
6. 7. 8.
Clique duas vezes no novo boto para abrir o Editor de Cdigo. Visual C# inseriu um mtodo chamado button1_Click que executado quando o boto for clicado. Altere o mtodo para ter esta aparncia: private void button1_Click(object sender, EventArgs e) {label1.Text = "Hello, World!";} Pressione F5 para compilar e executar o aplicativo. Quando voc clicar no boto, exibida uma mensagem de texto. Parabns! Voc acabou de escrever seu primeiro aplicativo C#.
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
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#).
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.
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
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.
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
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
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
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.
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
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
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
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.
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.
Visual C# Consolidado
55
As cores padro para campos trecho, cdigos editveis podem ser alteradas, modificando a Code Snippet Field configurao no painel Fonts and Colors da caixa Options de dilogo. Para obter mais informaes, consulte Como alterar face da fonte, tamanho, e cores usadas no Editor:. Criar trechos de cdigo Voc pode criar e utilizar trechos de cdigo personalizado, juntamente com os trechos de cdigo que esto includos com o Visual Studio por padro. Para obter mais informaes sobre como criar trechos de cdigo personalizado, consulte Criar trechos de cdigo. Observao Para trechos de cdigo C#, os caracteres que so vlidos para especificar o < atalho > campo so: caracteres alfanumricos, sinal numrico (#), o caractere til (~), o caractere de sublinhado (_), e o hfen trao caractere (-). Para obter mais informaes sobre trechos de cdigo que esto includos na Visual C# por padro, consulte Trechos de cdigo padro.
Cdigo Colorization
Editor de Cdigo analisa tokens e cdigo constri para que sejam facilmente reconhecvel e distinguishable de outros contedos de cdigo no Editor de Cdigo. Aps o Editor de Cdigo analisa seu cdigo, ele colorizes construes de cdigo adequadamente. Smbolos Editor de Cdigo colorizes o seguinte token tipos. Comment Cdigo excludo Identificador Keyword Nmero Operador Palavra-chave pr-processamento String Seqncia (C# @ Verbatim) Tipos de usurio Usurio tipos (tipos valor) Tipos de usurio (interface) Usurio tipos (enums) Usurio tipos (representantes) Seo CDATA XML Comentrio XML Atributo doc XML Comentrio XML doc
Visual C# Consolidado
56
Marca doc XML Voc pode modificar colorization padro da configurao usando o Fontes e cores, Ambiente, caixa de dilogo Opes.
Palavras-chave contextuais
Editor de Cdigo colorizes palavras-chave contextuais adequadamente. O Exemplo a seguir, o tipo yield est colorized turquesa, enquanto a palavra yield est azul colorized.
Brace Colorization correspondncia Editor de Cdigo facilita colorization negrito ou colorization de realce para Brace correspondncia.
Negrito Colorization
Quando voc editar qualquer uma dos pares construo de cdigo a seguir a seqncia, ou pares construo de cdigo rapidamente so exibidos em negrito para indicar uma associao entre elas: "" @" " #if, #endif #region, #endregion case, break default, break for, break for, continue foreach, break foreach, continue while, break while, continue Uma seqncia Uma seqncia verbatim Pr-processamento diretivas para sees condicionais Pr-processamento diretivas para sees condicionais Palavras-chave instruo controle Palavras-chave instruo controle Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao
Visual C# Consolidado
57
Voc pode desativar este recurso por unselecting a Automatic delimiter highlighting propriedade no Geral, editor de texto, caixa de dilogo Opes.
Realar Colorization
Quando o cursor est posicionado imediatamente antes um delimitador inicial, ou imediatamente aps um delimitador de trmino, retngulos cinza aparecem para realar tanto inicial e final delimitadores para indicar uma associao entre eles. Esse recurso est disponvel para os seguintes pares correspondentes: {} [] () Chaves Colchetes Parntese
Exemplo
Para ilustrar Brace correspondncia colorization, digite fazer (No copie e cole) o cdigo a seguir no Editor de Cdigo. class A { public A() { if(true) int x =0; else int x =1; } } Configuraes colorization Configuraes colorization so persistentes atravs de Configuraes do Visual Studio.
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
No No Pressionar a tecla F1 no exibe a janela da Ajuda dinmica. Para obter mais informaes sobre a janela Ajuda
Visual C# Consolidado
59
dinmico, consulte Como: Personalizar Ajuda dinmica ou Como controlar a janela da Ajuda dinmico:. Pesquisador de objetos Janela Output No No Explorer de soluo aparece encaixado no lado direito de IDE. A pgina inicial Exibe artigos na alimentao RSS MSDN no Visual C#.
Solution Explorer Sim Start Page Lista de tarefas (Visual Studio) Toolbox Sim, quando voc inicia o IDE No Sim, quando voc cria um aplicativo do Windows Forms
A caixa de ferramentas aparece como uma janela que encaixada no lado esquerdo de IDE recolhida.
Teclado Recurso Teclas de atalho Comportamento Essas configuraes de chave de atalho oferece suporte Visual C#: Emulao breve Emulao Emacs Visual C++ 2,0 padro teclas de atalho Teclas de atalho padro Studio 6.0 Visual
Teclas de atalho
O IDE (ambiente de desenvolvimento integrado) fornece vrios esquemas de ligao do teclado predefinidos. Voc pode criar seu prprio teclado personalizado esquemas de mapeamento do painel de ambiente opes na caixa de dilogo Opes teclado. Voc pode acessar a caixa de dilogo Opes no menu Ferramentas. Os esquemas de ligao do teclado disponveis incluem o seguinte:
2003 Studio visual teclas de atalho padro 6,0 Studio visual teclas de atalho padro Breve teclas de atalho padro Teclas de atalho padro Emacs Teclas de Atalho Padro do Visual Basic 6.0 Visual C++ 6.0 padro teclas de atalho Visual C++ 2,0 padro teclas de atalho
As combinaes de teclas de atalho a seguir funcionam no IDE. Muitos so padro combinaes teclas usadas na maioria dos aplicativos Windows; a tabela lista a funo especfica que tem o pressionamento de teclas no IDE. Name (Nome) Teclas de Descrio
Visual C# Consolidado
60
atalho Ativar menu aplicativo Ativar menu Janela Documento Ativar ferramenta menu Janela Aplicativo de fechamento Fechar documento Recolher Todos os ns de rvore Expandir todos os ns de rvore Mover para Barra de menus Mova para ferramentas prxima Mover para Barra de ferramentas anterior ALT + espaos ALT + HFEN Abre o menu Programa, permitindo ao usurio para gerenciar o estado da janela do aplicativo, por exemplo, mover ou redimensionar. Abre o menu de documento, permitindo ao usurio para gerenciar o estado da janela do documento ativo, por exemplo, mover ou redimensionar. Disponvel somente enquanto no modo MDI de dentro uma janela de documento. Abre o menu Janela ferramenta, permitindo ao usurio para mover a janela ferramenta no IDE. Disponvel somente ao dentro de uma janela ferramenta. Fecha o IDE. Fecha o documento aplicativo ativo. Recolhe todos os ns no modo de exibio de rvore atual. Expande todos os ns no modo de exibio de rvore atual. Ativa a barra de menus IDE principal. Move para a prxima barra de ferramentas visvel. Disponvel somente enquanto a barra de menus principal estiver ativa. Move para a barra de ferramentas visvel anterior. Disponvel somente enquanto a barra de menus principal estiver ativa. Ativa a barra de ferramentas Janela ferramenta. Disponvel somente em uma janela ferramenta contendo uma barra de ferramentas. Move o foco em modo de exibio de rvore para baixo sem alterar a seleo. Este atalho pode ser utilizado para selecionar vrios itens na rvore. Move o foco em modo de exibio de rvore backup sem alterar a seleo. Este atalho pode ser utilizado para selecionar vrios itens na rvore. Exibe o menu de atalho. Oculta e mostra uma lista drop-down. Disponvel somente de uma lista drop-down. Alterna uma seleo para o foco atual em modo de exibio de rvore.
ALT + HFEN
Mova para SHIFT + ALT ferramentas Janela ferramenta Mover o foco de rvore abaixo Move o foco de rvore cima Menu de atalho Alternar visibilidade lista drop-down Alternar seleo foco de rvore CTRL + DOWN. CTRL + UP
SHIFT + F10 F4
CTRL + SPACEBAR
Visual C# Consolidado
61
Lista Global teclas de atalho, definies gerais de desenvolvimento comuns combinaes de teclas de atalho, bem como combinaes de teclas que podem ser usadas em uma variedade de locais dentro do IDE. Lista Designer de HTML teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao trabalhar no modo Design e modo de exibio de HTML do Designer de HTML. Lista XML teclas de atalho do criador, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao trabalhar em exibio Esquema de designer XML. Lista Teclas de acelerao para o Editor de dilogo disponveis ao trabalhar no Editor de dilogo. Lista Teclas de acelerao para o editor de imagem disponveis ao trabalhar no editor de imagem. as combinaes de teclas de atalho as combinaes de teclas de atalho as combinaes
Lista Depurao teclas de atalho, definies gerais de desenvolvimento de teclas de atalho disponveis ao usar o depurador.
Lista Pesquisar e substituir teclas de atalho, definies gerais de desenvolvimento o atalho chave combinaes disponveis ao usar a localizar Localizar, substituir, em arquivos, e substituir nas caixas de dilogo Arquivos. Lista Dados teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao usar o Query Designer ou designer de banco de dados. Lista Controlar manipulao teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis para mover e redimensionar controles em uma superfcie de design. Lista Texto teclas de atalho de navegao, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao mover dentro de cdigo em um documento aberto. Lista Texto teclas de atalho de seleo, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao selecionar texto em um documento aberto. Lista Texto teclas de atalho de manipulao, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis quando movendo, excluindo ou formatar texto em um documento aberto. Lista Janela teclas de atalho de gerenciamento, definies gerais de desenvolvimento combinaes de teclas de atalho disponveis para mover, Fechar, ou navegar em janelas ferramenta e documentos. Lista Integrada teclas de atalho da Ajuda, definies gerais de desenvolvimento combinaes de teclas de atalho disponveis ao exibir e procurar tpicos da Ajuda. Lista Objeto teclas de atalho do navegador, definies gerais de desenvolvimento combinaes de teclas de atalho disponveis ao trabalhar no Pesquisador de objetos. Lista Macro teclas de atalho, definies gerais de desenvolvimento teclas de atalho disponveis para trabalhar com macros. as as as
as combinaes de as
Lista Ferramenta janela teclas de atalho, definies gerais de desenvolvimento combinaes de teclas de atalho que exibem as janelas ferramenta vrios.
Lista Projeto teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho que podem ser usadas para adicionar novos itens a um projeto, criar um projeto, ou abrir arquivos ou Projetos.
Visual C# Consolidado
62
Lista Acelerador e teclas de atalho Editor de seqncia, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao trabalhar em componente editor, editor STRING, e Accelerator editor.
Visual C# Consolidado
63
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
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.
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:
Na Internet, o Data Access and Storage Developer Center est sempre atualizado com novos artigos e exemplos.
Visual C# Consolidado
66
Visual C# Consolidado
67
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.
4. 5.
Visual C# Consolidado
69
Uma caixa de dilogo aparece com informaes sobre propriedades padro para depurao do projeto. 6. 7. Clique Yes para atualizar para o novo projeto depurao propriedades padro. O projeto se voc clicar em No, no ser compilado at que voc faa alteraes manualmente. Clique no link para o relatrio de converso para ver detalhes sobre o status de converso, ou ento clique em Close. A soluo abre com o novo sistema do projeto visvel no Solution Explorer, mais os arquivos da verso antiga da soluo. 8. 9. Mover o cdigo do arquivo classe principal antigo para o novo ThisDocument,
Visual C# Consolidado
70
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.
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
Visual C# Consolidado
71
Adicionar um formulrio do Windows ao projeto Criar um formulrio do Windows para o usurio fornea informaes prompt.
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.
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
Visual C# Consolidado
72
2. 3.
Clique duas vezes no boto para abrir o arquivo de cdigo com manipulador de eventos do boto Click adicionado. Adicione cdigo ao manipulador de eventos para levar a entrada da caixa de texto, envi-lo para a funo WriteStringToCell, e depois feche o formulrio. C#
Globals.ThisWorkbook.WriteStringToCell(this.textBox1.Text); this.Dispose(); Testando Agora voc pode testar sua pasta de trabalho para certificar-se de que o formulrio Windows aparecer, e se a entrada aparece nesta planilha.
Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard.
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
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.
Visual C# Consolidado
74
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.
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.
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:
Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel.
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.
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.
Visual C# Consolidado
77
3.
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:.
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.
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,
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
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
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.
Visual C# Consolidado
80
3. 4. 5. 6.
Duplo clique dentro namedRange1, e verifique se o texto sobre BeforeDoubleClick eventos est inserido com texto em itlico em namedRange2 vermelho. Clique fora do namedRange1 e observe que o evento de alterao ocorre quando sair Modo Edio mesmo que nenhuma alterao para o texto foi feita. Alterar o texto dentro namedRange1. Clique fora do namedRange1, e verifique se o texto sobre Change evento est inserido com texto em namedRange2 azul. Prximas etapas
Essa explicao passo a passo mostra noes bsicas de programao contra eventos de um NamedRange controle. Aqui esto algumas tarefas que podem vie em seguida:
Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Programao contra eventos dos XMLNode controles modo. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:.
Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos
Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o 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.
Visual C# Consolidado
81
2. 3.
Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#
private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); } 4. 5. 6. 7. 8. 9. No menu File, clique em Save All. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. Clique em Save. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Feche o Excel.
10. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 11. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado.
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.
7. 8. 9.
1. 2.
Criar uma fonte de dados para um projeto do Excel. Adicionar controles a uma planilha. Rolar pelos registros do banco de dados. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto
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.
Observao Se Show Data Sources clique dentro a pasta de trabalho do Excel e depois verificar novamente.
Visual C# Consolidado
84
no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.
Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. 7. 8. Aps uma conexo foi selecionado ou criado, clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Marque a caixa de seleo ao lado da Customers tabela. Clique em Finish.
O assistente adicionar a Customers tabela para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Para essa explicao passo a passo, voc precisa de dois intervalos nomeados e quatro botes na primeira planilha. Primeiro, adicione os dois intervalos nomeados a partir da Data Sources janela para que automaticamente eles so vinculados fonte de dados. Em seguida, adicione os botes da Toolbox.
Clula
Visual C# Consolidado
85
B3 C3 D3
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.
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(); }
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(); }
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
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.
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.
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
Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto
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.
Observao Se Show Data Sources clique dentro a pasta de trabalho do Excel e depois verificar novamente. no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.
Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. 7. 8. Aps uma conexo foi selecionado ou criado, clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Marque a caixa de seleo ao lado da Employees tabela. Clique em Finish.
O assistente adicionar a Employees tabela para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Para essa explicao passo a passo, voc precisa um ListObject controle e um Button controle na primeira planilha. Primeiro, adicione o ListObject controle a partir da Data Sources janela para que ela est vinculada automaticamente fonte de dados. Em seguida, adicione o Button controle da Toolbox.
1. 2. 3. 4.
Verifique se a My Complex Data Binding.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Abra a Data Sources janela e selecione o Employees n. Clique na seta suspensa que aparece. Selecione ListObject na lista drop-down, e arraste a Employees tabela clula A6. Um ListObject controle denominado EmployeesListObject criado na clula A6. Ao mesmo tempo, nomeado EmployeesBindingSource, um adaptador de tabela, e uma DataSet instncia so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource,
Na guia Common Controls Da adicionar um Button controle a clula A4 da planilha. o Toolbox, Inicializao do controle
A prxima etapa para adicionar texto ao boto quando a planilha abre. Adicionar texto ao boto no manipulador Startup de eventos.
Ao inicializar o controle
1. 2. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para o b utton. C# this.button1.Text = "Save"; 3. C# somente, para adicionar um manipulador de eventos para o Click evento para o
Sheet1_Startup mtodo.
C# this.button1.Click += new EventHandler(button1_Click); Agora, adicione cdigo para manipular o Click Evento do boto. Salvar alteraes no banco de dados As alteraes tenham sido feitas o dados existe somente no dataset local at que eles so salvos explicitamente volta para o banco de dados.
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.
Pressione F5. Verifique que quando abrir a pasta de trabalho, o objeto lista preenchido com dados da tabela Employees.
CdigoDoFuncionrio 10
Visual C# Consolidado
90
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:.
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.
Visual C# Consolidado
91
Criando um novo projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.
Criar um projeto de pasta de trabalho do Excel com o nome My Master-Detail, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My MasterDetail projeto para Solution Explorer. Criando o DataSet Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.
Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo usando o New Connection boto. 4. 5. 6. 7. 8. Aps selecionar ou criar uma conexo, clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Selecione a Orders tabela e a Order Details tabela. Clique em Finish.
O assistente adicionar as duas tabelas para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Nesta etapa, voc adicionar um intervalo nomeado, um objeto de lista, e dois botes primeira planilha. Primeiro, adicionar o intervalo nomeado e o objeto lista a partir da Data Sources janela para que automaticamente eles so vinculados fonte de dados. Em seguida, adicione os botes da Toolbox.
Visual C# Consolidado
92
esta Order Details Tabela, no a um que seja no mesmo nvel como a Orders Tabela, e clique a seta suspensa que aparece. 6. 7. Clique ListObject na lista drop-down, e arraste a Order Details tabela clula A6. Um ListObject controle denominado Order_DetailsListObject criado na clula A6, e vinculado BindingSource. Na guia Common Controls Da adicionar um Button controle a clula A3 da planilha. o Toolbox, nome Button1 este boto. 2. Adicionar um outro Button controle a clula B3 da planilha. nome Button2 este boto. Em seguida, marcar DataSet para ser armazenado em cache no documento. Cache o DataSet Marcar DataSet para ser armazenado em cache no documento, tornar DataSet pblicos e definindo a CacheInDocument propriedade.
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.
6. 7. 8.
Implantar a soluo. Para obter mais informaes, consulte Como implantar solues do Office:. Recuperar dados de cache para outro projeto. Para obter mais informaes, consulte Como recuperar dados de uma pasta de trabalho em um servidor em cache:.
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.
Visual C# Consolidado
95
7. 8. 9.
Na lista As object in:, selecione Sheet1. Clique em Finish. Reposicionar o grfico para que o canto direito superior alinhe com Clula E2.
10. Salve o arquivo para a unidade C: e nome-la ExcelChart.xls. 11. Feche o Excel. Criando um novo projeto Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel.
2. 3.
Selecione o Chart controle no designer e alterar as seguintes propriedades na janela Properties: Value (Valor) dataChart False
Propriedade
Visual C# Consolidado
96
Name Text 3.
columnChart Grfico de coluna Adicionar um boto de opo segundo para o controle de usurio, e alterar as propriedades a seguir: Value (Valor) barChart Grfico de barras Adicionar um boto de opo terceiro para o controle de usurio, e alterar as propriedades a seguir: Value (Valor) lineChart Grfico de linha Adicionar um boto de opo quarto para o controle de usurio, e alterar as propriedades a seguir: Value (Valor) areaBlockChart Grfico bloquear de rea
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.
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; } }
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
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.
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:.
Visual C# Consolidado
99
Adicionar controles a uma planilha. Criar um controle painel Aes. Adicionar controles Windows Forms ligados a dados a um controle painel Aes. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto
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
Observao Se Show Data Sources clique dentro na planilha do Excel e depois verificar novamente. no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.
Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. Clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects.
Visual C# Consolidado
100
7. 8. 9.
Marque a caixa de seleo ao lado da Suppliers tabela. Expandir a Products tabela e selecione ProductName, SupplierID, QuantityPerUnit. e UnitPrice Clique em Finish.
O assistente adiciona a Suppliers tabela e Products Tabela janela Data Sources. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Em seguida, adicione um NamedRange controle e um ListObject controle primeira planilha.
6.
Para adicionar controles Windows Forms ligados a dados a um controle painel Aes
1. Das Common Controls guias da Toolbox, arraste um ComboBox controle para o controle painel Aes.
Visual C# Consolidado
101
2. 3.
Alterar a Size propriedade para 171, 21. Redimensionar o controle de usurio para ajustar os controles. Vinculando o controle no painel Aes a dados
Neste seo, voc ser definir a fonte de dados de mesma fonte de dados como o NamedRange controle em uma planilha.. com a mesma fonte de dados que o NamedRange controle em uma planilha o ComboBox o ComboBox
Visual C# Consolidado
102
3.
Selecione uma empresa na caixa Lista. Verifique se o nome da empresa est listado no controle NamedRange e se os detalhes do produto esto listados no ListObject controle. Selecione vrias empresas para verificar o nome da empresa e Detalhes do Produto altere conforme apropriado. Prximas etapas
4.
Essa explicao passo a passo mostra as noes bsicas de vinculao de dados a controles em um painel Aes no Excel. Aqui esto algumas tarefas que podem vie em seguida:
Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Ligao de dados a controles no Word. Para obter mais informaes, consulte Vinculao de Dados para controles em um painel Aes do Word Walkthrough:. Mostrar e ocultar controles no painel de aes. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:
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 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
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.
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.
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.
2.
2.
Visual C# Consolidado
106
2. 3.
Copiar o documento de Soluo e a manifesto de implantao para \\DeployServer\ShareFolder. Copiar o conjunto de soluo e o manifesto do aplicativo para \\DeployServer\ShareFolder\WordDeployment_1.0.0.0. Conceder confiana total para a pasta de rede
Para execute sua Visual Studio Tools for Office soluo a partir da pasta de rede, voc deve conceder confiana total para a pasta de rede na sua diretiva de segurana no computador de desenvolvimento. Voc pode modificar a diretiva de segurana de um prompt de comando usando a ferramenta Diretiva de Segurana para Acesso ao Cdigo (Caspol.exe). Para conceder confiana para um local de rede, voc deve ter privilgios de administrador e voc dever alterar a diretiva de segurana no nvel do computador. Observao Este procedimento destinado a fim de executar essa explicao passo a passo. No use este procedimento para conceder confiana a conjuntos ou diretrios se no tiver certeza que sejam segura e protegida. Para obter mais informaes sobre concesso e remover permisses, consulte HOW TO: conceder permisses para pastas e montagens e Como remover permisses de pastas e montagens:.
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.
Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo.
Visual C# Consolidado
107
Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.
Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues. Criando o projeto
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.
Visual C# Consolidado
108
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); } 3. 4. 5. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Saia do Excel. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos.
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.
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.
Visual C# Consolidado
111
8. 9.
Em expandir Install. o Custom Actions Editor, Clique com o boto direito do mouse Primary output from ExcelCustomAction (Active) e, em seguida clique em Properties Window.
10. Na janela Properties, defina a CustomActionData propriedade para a seguinte seqncia: /targetdir="[TARGETDIR]/" /documentname="ExcelDeployment.xls" /assemblyname="ExcelDeployment.dll" Para obter informaes sobre a CustomActionData propriedade, consulte Propriedade CustomActionData. 11. Clique com o boto direito do mouse e, em seguida clique em Build. Em Solution Explorer, o ExcelSetup project Teste a instalao Agora voc pode testar a soluo para garantir que sua soluo instalada quando voc executar o arquivo do Windows Installer no seu computador de desenvolvimento.
Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos
Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o 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.
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.
Visual C# Consolidado
113
Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 5. 6. Clique em Yes. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 7. 8. Clique em OK. Feche o Excel.
O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.
Visual C# Consolidado
114
7. 8. 9.
Clique em Next. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo
Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta.
Visual C# Consolidado
115
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.
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
Observao Voc tambm pode adicionar o Bookmark controle usando a Bookmark caixa de dilogo, encontrada no menu Insert.
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.
Visual C# Consolidado
118
3.
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:.
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.
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.
Visual C# Consolidado
119
Observao No Word, controles so ignorados na linha com texto por padro. Voc pode modificar, controles forma, bem como objetos forma, so inseridos na guia Edit da caixa Options de dilogo. 3. 4. 5. No menu View, selecione Properties Window. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a Name propriedade da caixa de texto para displayText. Arraste um Button controle para o documento e alterar as seguintes propriedades: Value (Valor) insertText Inserir texto
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.
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
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
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.
Este um Exemplo de criar um menu de atalho quando voc clica com o boto direito do mouse texto em um indicador.
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
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.
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
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.
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
Visual C# Consolidado
124
Um grfico adicionado ao documento no ponto de insero, e a Datasheet janela exibida com alguns dados padro. 3. 4. 5. Feche a Datasheet janela para aceite os valores padro no grfico e clique dentro do documento para mover foco fora do grfico. Clique com o boto direito do mouse no grfico e selecione Format Object. Na guia Layout da caixa de dilogo, selecione Square e Format Object Clique em OK. Adicionar um controle de usurio ao projeto
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.
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.
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.
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.
Criar um controle painel Aes para o painel Aes. Adicionar controles que so acoplados a dados a um controle painel Aes Windows Forms. Use uma Relao mestre / detalhes quando exibir dados nos controles. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Microsoft Visual Studio 2005 Tools for the Microsoft Office System
Visual C# Consolidado
128
O Microsoft Office Word 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto
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.
Observao Se Show Data Sources Clique dentro do documento do Word e marque novamente. no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.
Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. 7. 8. Clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Marque a caixa de seleo ao lado e Products tabelas. o Suppliers Clique em Finish.
O assistente adiciona a Suppliers tabela e Products Tabela janela Data Sources. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer.
Para adicionar controles Windows Forms ligados a dados a um controle painel Aes Visual C# Consolidado 129
1. 2. 3.
Na janela Data Sources, expanda a Suppliers tabela. Clique na seta suspensa no n Company Name, e selecione ComboBox. Arraste CompanyName da janela Data Sources para o controle painel Aes. Um ComboBox controle criado no controle painel Aes. Ao mesmo tempo, nomeado SuppliersBindingSource, um adaptador de tabela, e um DataSet so adicionados ao projeto no bandeja de componentes. um BindingSource
Observao Um navegador de ligao tambm adicionado para o bandeja de componentes e para o topo do controle painel Aes. Voc remover esse controle posteriormente no explicao passo a passo o. 4. 5. 6. 7. Mover a caixa de combinao para que ele seja sob o rtulo e alterar a Size propriedade 171, 21. Expandir a Products tabela na janela Data Sources. Clique na seta suspensa no n ProductName, e selecione ListBox. Arraste ProductName para o controle painel Aes. Um ListBox controle criado no controle painel Aes. Ao mesmo tempo, chamado ProductBindingSource e um adaptador de tabela so adicionados para o projeto no bandeja de componentes. um BindingSource 8. Do SuppliersBindingNavigator Selecione na bandeja e Component pressione DELETE.
Observao Excluindo o SuppliersBindingNavigator faz no remover todos os o cdigo que foi gerado para ele. Voc pode remover este cdigo. 9. Mover a caixa de listagem para que ele seja sob o rtulo e alterar a Size propriedade 171,95.
10. Arraste controlar e coloc-lo a caixa de listagem abaixo. de para o painel Aes um Button o Toolbox 11. Clique com o boto direito do mouse clique Properties no menu de atalho, e altere as seguintes propriedades: o Button, Propriedade Name Text Value (Valor) Inserir Inserir
12. Redimensionar o controle de usurio para ajustar os controles. Configurando a fonte de dados Nesta seo, voc adicionar cdigo ao Load Evento do controle painel Aes para preencher o controle com dados da DataTable. Do DataSource voc ir ento definir e DataMember propriedades para cada controle.
Visual C# Consolidado
130
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); } }
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.
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
Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Criando 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.
Visual C# Consolidado
134
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.
Observao Para digitar um smbolo de grau (), pressione ALT e digite 248. 3. 4. Clique no cone de marca inteligente que aparece sobre a seqncia reconhecida e clique em Convert to Celsius. Confirme que a seqncia original substituda por uma nova seqncia contendo a temperatura em Celsius.
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
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
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.
Visual C# Consolidado
136
O Publish Wizard aparece. 3. 4. Na caixa Specify the location to publish this application, digite C:\TestDeploy. Clique em Finish. O documento de Soluo e manifesto de implantao so copiados para C:\TestDeploy. O conjunto de soluo, atualizado manifesto do aplicativo, e cpias do documento de Soluo e manifesto de implantao so copiadas para C:\TestDeploy\WordDeployment_1.0.0.0. Para obter mais informaes, consulte Implantando o Word e Excel Solutions. 5. Feche o WordDeployment projeto no Visual Studio.
Observao O conjunto no tem permisso para executar ainda, para que ele se voc tentar executar a soluo ser lanar um erro. Voc ir atualizar sua diretiva de segurana para conceder permisso de confiana total ao conjunto em uma etapa posterior. Quando voc publicar uma soluo, o manifesto do aplicativo incorporado no aponta de documento de soluo para o caminho completo da manifesto de implantao. Se voc relanamento os arquivos de soluo para outro local, dever atualizar o manifesto do aplicativo incorporado para apontar para a nova localizao da manifesto de implantao. Voc tambm deve atualizar a manifesto de implantao e o manifesto do aplicativo externo para apontar para os novos locais de arquivo. Atualizando o manifesto Application incorporados Para editar o manifesto do aplicativo incorporado, use a ServerDocument classe que Visual Studio Tools for Office fornece. Quando voc usa a ServerDocument classe, voc deve executar o cdigo em um novo projeto (no a Visual Studio Tools for Office Soluo), como um projeto de console, e o Visual Studio Tools for Office documento de soluo deve ser fechado. Observao Inclui Visual Studio Tools for Office um Exemplo que demonstre como criar uma ferramenta que pode ser usada para editar o manifesto do aplicativo incorporado. Para obter mais informaes, consulte Aplicativo Manifest Exemplo Editor.
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.
2.
2.
Visual C# Consolidado
138
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.
Visual C# Consolidado
139
Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo. Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.
Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao
Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues. Criando o projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.
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.
Visual C# Consolidado
140
1. 2.
Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisWorkbook classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); } 3. 4. 5. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Saia do Excel. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos.
Visual C# Consolidado
141
A sada do projeto e dependncias aparecem no painel direito. 8. 9. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n de projeto. Clique com boto direito mouse cada dependncia, exceto para Microsoft .NET Framework, e clique Exclude no menu de atalho. Criar um projeto de ao personalizada Nesta etapa, voc ir criar um projeto que contm aes personalizadas para o projeto de instalao. Aes personalizadas so um recurso do Windows Installer que permitem a voc para executar cdigo no final de uma instalao para executar aes que no podem ser executadas durante a instalao. Para obter mais informaes, consulte Aes Personalizadas.
Visual C# Consolidado
142
5. 6.
Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer, ou ManifestEditor.vb arquivo e clique em View Code. Adicione a instruo seguinte Imports ou using para o topo do arquivo de cdigo. C#
using Microsoft.VisualStudio.Tools.Applications.Runtime; 7. Copie o cdigo a seguir para a ManifestEditor classe. Esse cdigo substitui o Install mtodo, que usado para executar aes Instalao personalizada. O cdigo define o local de instalao especificado pelo usurio para a AssemblyPath propriedade. O caminho de instalao especificado pelo usurio e os nomes do documento e conjunto so obtidas a partir da Parameters propriedade. C# // Override the Install method to update the customization location // in the application manifest. public override void Install(System.Collections.IDictionary stateSaver) { UpdateApplicationManifest(); base.Install(stateSaver); } // Update the application manifest according to the the install location. private void UpdateApplicationManifest() { // Get the parameters passed to the task. string targetDir = this.Context.Parameters["targetdir"]; string documentName = this.Context.Parameters["documentname"]; string assemblyName = this.Context.Parameters["assemblyname"]; // Get the application manifest from the document. string documentPath = System.IO.Path.Combine(targetDir, documentName); ServerDocument serverDocument1 = new ServerDocument(documentPath, System.IO.FileAccess.ReadWrite); try { AppManifest appManifest1 = serverDocument1.AppManifest; string assemblyPath = System.IO.Path.Combine(targetDir, assemblyName); appManifest1.Dependency.AssemblyPath = assemblyPath; serverDocument1.Save(); } finally { if (serverDocument1 != null) { serverDocument1.Close(); } } } 8. Clique com o ExcelCustomAction projeto no Solution Explorer, e, em seguida clique em Build. Adicionando a ao personalizada ao projeto de instalao Nesta etapa, voc adicionar a sada do projeto ExcelCustomAction principal para o projeto de instalao. Isso permite que o arquivo Windows Installer para executar a ao personalizada que edita o manifesto do aplicativo.
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.
Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos
Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto
Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha.
Para adicionar uma caixa de mensagem a um evento de inicializao Visual C# Consolidado 144
1. 2. 3.
Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#
private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); } 4. 5. 6. 7. 8. 9. No menu File, clique em Save All. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. Clique em Save. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Feche o Excel.
10. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 11. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado.
Visual C# Consolidado
145
Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 7. 8. Clique em OK. Feche o Excel.
O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.
7. 8. 9.
Visual C# Consolidado
146
Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta.
2.
Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.
2. 3.
Visual C# Consolidado
147
Para adicionar um controle Windows Forms para o documento clicando uma nica vez sobre o controle
1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da clique Toolbox, o controle voc deseja adicionar Um documento, clique onde desejar o controle a ser adicionado. O controle adicionado ao documento com o tamanho padro. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.
2. 3.
Para adicionar um controle Windows Forms para o documento clicando duas vezes no controle
1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Controle voc deseja para adicionar de clique duplo no Toolbox. O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.
2.
Para adicionar um controle Windows Forms para o documento, pressionando a tecla ENTER
1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da Clique no controle que voc deseja adicionar e pressione a tecla ENTER. o Toolbox, O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Voc tambm pode adicionar controles Windows Forms dinamicamente a um documento em tempo de execuo usando os mtodos auxiliar fornecidos pelo Microsoft Visual Studio 2005 Tools for the Microsoft Office System. No Exemplo abaixo, clula A1 de um projeto de aplicativo Excel. adicionado um Button Para obter informaes sobre como adicionar outros controles Windows Forms, consulte Adicionar controles a documentos do Office em tempo de execuo. Adicionando controles em tempo de execuo
2.
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"; }
Executar clculos para o aplicativo inteiro Para executar clculos em todas as pastas de trabalho abertas
Este cdigo deve ser colocado em uma classe folha, no na classe ThisWorkbook.
Visual C# Consolidado
149
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."; }
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
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
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
Visual C# Consolidado
154
A linguagem de programao C# para desenvolvedores Java Exemplos de cdigo C# para desenvolvedores Java Tipos de aplicativos C# para desenvolvedores Java
Recurso Herana: em C++, classes e estruturas so praticamente idnticas enquanto em C#, eles so bem diferentes. Classes C# pode implementar qualquer nmero de interfaces, mas pode herdar de apenas uma classe base. Alm disso, estruturas C# no oferece suporte a herana, e no oferecerem suporte para construtores padro explcito (um fornecida por padro). Matrizes: em C++ uma matriz simplesmente um ponteiro. No C#, matrizes so objetos que incluem mtodos e propriedades. Por exemplo, o tamanho de uma matriz pode ser consultado via a Length propriedade. Matrizes C# tambm empregar Indexadores que verificam cada ndice usado para acessar a matriz. A sintaxe de declarao matrizes C# diferente do idioma para matrizes C++: os smbolos [] " " aparecer aps o tipo de matriz no C#, no a varivel. Booleans: em C++, o bool tipo essencialmente um inteiro. Em C#, h
bool
Visual C# Consolidado
155
nenhuma converso entre o bool tipo e outros tipos. O long tipo enquanto em C++, ele est 32 bits.: em C#, o long tipo 64 bits, Passar parmetros: em C++, todas as variveis so passados por valor, a menos que explicitamente passados com um ponteiro ou uma referncia. Do ref no C#, classes so passados por referncia e estruturas so passadas pelo valor a menos que explicitamente passados por referncia com ou out modificadores de parmetro. A switch instruo: ao contrrio a instruo C++ switch, C# no oferece suporte through fall-de um rtulo case para outro. Representantes: representantes C# so aproximadamente semelhantes aos indicadores de funo em C++, so de tipo seguro e segura. Mtodos de classe base: C# oferece suporte a base palavra-chave para chamar os membros de substitudo classe base de classes derivadas. Alm disso, substituir mtodos virtual ou abstract explcito em C#, usando a override palavra-chave. Ocultando mtodo: C++ oferece suporte a implcito " ocultar " do mtodo atravs de herana. Em C#, voc deve usar o new modificador para explicitamente ocultar um membros herdadas Diretivas de pr-processamento so usadas para compilao condicional. Nenhum arquivo de cabealho so usados em C#. A manipulao de exceo e exceo acionada.: C# fornece palavrachave finally para fornecer para cdigo que deve ser executado independentemente de se Operadores C# e typeof.: C# oferece suporte, como is operadores adicionais Ele tambm apresenta funcionalidade diferente para alguns operadores lgicos. long struct Classe (referncia) C# ref Fora (referncia C#) Alternar Delegar Base Consulte tambm os exemplos para Substituir Novo
Directives Preprocessor C# finally tryfinally try-catch& Operator Operador | Operador ^ TypeOf extern
Palavra-chave extern: em C++, extern usado para importar tipos. No C#, extern usada para criar aliases para usar verses diferentes do mesmo conjunto. Palavra-chave static: em C++, static pode ser usado tanto para declarar entidades nvel de classe e para declarar tipos que so especficos para um mdulo. No C#, static s usada para declarar entidades nvel de classe. O Main mtodo em C# declarado de forma diferente da funo main em C++. Em C#, ele seja maiscula e sempre static. Alm disso, o suporte para processamento de argumentos de linha de comando muito mais robusta em C#. Ponteiros so permitidos em C#, mas somente no unsafe modo. Sobrecarga operadores ser executada de maneira diferente em C#. Seqncias: em C++ uma seqncia simplesmente um arra de caracteres. Em C#, seqncias so objeto que oferecem suporte robustos mtodos de pesquisa. Palavra-chave foreach permite-lhe percorrer matrizes e colees.
static
Main() e argumentos de linha de comando (Guia de programao C#) No seguro Operadores C# string String foreach, em
Visual C# Consolidado
156
Globals: em C#, no h suporte para mtodos globais e variveis Mtodos e variveis precisa estar contidos em ou struct. um class Importando Tipos: em C++, tipos comuns a vrios mdulos so colocados em arquivos de cabealho. No C#, essas informaes est disponveis atravs de metadados. Variveis locais em C# no podem ser usadas antes que eles sejam inicializados. Gerenciamento de memria: C++ no uma linguagem de lixo coletado; memria que no explicitamente Release permanece alocada at que o processo termina. C# uma linguagem de lixo coletado. Destructors: C# tem sintaxe diferente para deterministically liberando recursos no gerenciados. Construtores: similar ao C++, se voc no fornecer um construtor de classe em C#, um construtor padro gerado automaticamente para voc. O construtor padro inicializa todos os campos para seus valores padro. C# no oferece suporte campos Bit. Servios de entrada / sada C# e formatao contam com a biblioteca de tempo de execuo do .NET Framework. Em C#, parmetros de mtodo no podem ter valores padro. Use overloads mtodo se voc desejar obter o mesmo efeito. Em C#, tipos genricos e mtodos fornecem para parametrizao Tipo de uma maneira que semelhante aos modelos C++, embora existem diferenas significativas. Palavra-chave as semelhante a um efeito padro, exceto que em vez de acionar uma exceo se falhar a converso, o valor de retorno nulo. Isso semelhante ao uso static_cast em C++, que,. diferente dynamic_cast, executa nenhuma verificao em tempo de execuo e, portanto, no no acionar uma exceo na falha
Estrutura geral de um programa C# Usando Viso Geral Sobre Metadados Mtodos (Guia de programao do C#) Coleta de Lixo
Destructors Instruo using (Referncia do C#) Construtores da instncia Tabela de valores padro Campos bit C++ Tour linguagem C# Formatao numrica tabela de resultados Compilador CS0241 de erro Generics em C#
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
Podendo tambm retornar um int: CSharp static int Main() { //... return 0; }
Com ambos os tipos de retorno, pode levar argumentos: CSharp static void Main(string[] args) { //... } OuCSharp static int Main(string[] args) { //... return 0; }
O parmetro do mtodo Main uma matriz (array) de string que representa os argumentos de linha de comando usados para chamar o programa. Observe que, diferentemente C++, essa matriz no inclui o nome do arquivo executvel (EXE). Para obter mais informaes sobre como usar argumentos de linha de comando, consulte o Exemplo em Main() e argumentos de linha de comando (Guia de programao C#) e COMO: Criar e usar DLLs em C# (Guia de programao C#). Entrada e Sada
Visual C# Consolidado
159
Programas C# geralmente usam os servios de entrada / sada fornecidos pela Biblioteca de tempo de execuo do .NET Framework A instruo, System.Console.WriteLine("Hello World!"); usa o mtodo WriteLine , um dos mtodos de sada da classe Console na biblioteca de tempo de execuo. Ele exibe seu parmetro de seqncia no fluxo de sada padro seguido por uma nova linha. Outros mtodos da classe Console so usados para diversas operaes de entrada e sada. Se voc incluir a diretiva using System;no incio do programa, voc pode usar as classes e mtodos do namespace System sem ter de referenci-los totalmente. Por exemplo, voc pode chamar Console.WriteLine Em vez de, System.Console.Writeline: CSharp using System; CSharp Console.WriteLine("Hello World!"); Para obter mais informaes sobre mtodos de entrada / sada, consulte System.IO. Compilao e execuo Voc pode compilar o programa " Hello World! " Criando um projeto no Visual Studio IDE, ou usando a linha de comando. Use o Prompt de Comandos do Visual Studio ou execute o arquivo vsvars32.bat para colocar a ferramenta Visual C# definida no caminho do seu prompt de comando. Para compilar o programa a partir da linha de comando:
Crie o arquivo de origem usando qualquer editor de texto e salv-lo usando um nome, como Hello.cs. Arquivos cdigo fonte C# usam a extenso .cs. Para chamar o compilador, digite o comando: Se seu programa no contm quaisquer erros de compilao, um arquivo chamado Hello.exe ser criado.
csc Hello.cs
Hello Para obter mais informaes sobre o compilador C# e suas opes, consulte Opes do compilador 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.
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>
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
Visual C# Consolidado
163
ERRORLEVEL
varivel, arquivos em lotes portanto podem determinar o resultado da execuo. Tradicionalmente, um valor de retorno de zero indica execuo com xito. Abaixo um programa muito simples que retorna zero da funo Main. class MainReturnValTest { static int Main() { //... return 0; } }
C# Como este Exemplo usa um arquivo em lotes, melhor para compilar esse cdigo a partir da linha de comando, conforme demonstrado no Como construir a partir da linha de comando:. Em seguida, um arquivo em lotes usado para chamar o executvel resultante do Exemplo de cdigo anterior. Porque o cdigo retorna zero, o arquivo em lotes ir reportar xito, mas se o cdigo anterior alterado para retornar um valor diferente de zero, e ento re-Compiled, subseqente execuo do arquivo em lotes indicar falha. rem test.bat @echo off MainReturnValueTest @if "%ERRORLEVEL%" == "0" goto good :fail echo Execution Failed echo return value = %ERRORLEVEL% goto end :good echo Execution Succeded echo return value = %ERRORLEVEL% goto end :end Sada de exemplo Execution Succeded return value = 0
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
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
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#.
Visual C# Consolidado
165
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
Visual C# Consolidado
168
Exemplo matrizes Download sample Este Exemplo descreve e mostra como matrizes funcionam em C#. Para obter mais informaes, consulte Matrizes (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo matrizes no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc arrays.cs arrays
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
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
Visual C# Consolidado
171
por exemplo, um caractere de espao, e retorna uma matriz de substrings. Voc pode acessar essa matriz com foreach, como este: C# char[] delimit = new char[] { ' ' }; string s10 = "The cat sat on the mat."; foreach (string substr in s10.Split(delimit)) { System.Console.WriteLine(substr); } Esse cdigo sadas cada palavra em uma linha separada, como este: The cat sat on the mat. Usando StringBuilder A StringBuilder classe cria um buffer de seqncia que oferece melhor desempenho se seu programa executa uma grande quantidade de manipulao de seqncia de caracteres. A StringBuilder seqncia tambm permite que voc para reatribuir caracteres individuais, algo que o tipo de dados de seqncia interna no oferece suporte. Esse cdigo, por exemplo, altera o contedo de uma seqncia sem criar uma nova seqncia: C# System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet"); sb[0] = 'C'; System.Console.WriteLine(sb.ToString()); System.Console.ReadLine(); Neste exemplo, um StringBuilder objeto usado para criar uma seqncia de um conjunto de tipos numricos: C# class TestStringBuilder { static void Main() { System.Text.StringBuilder sb = new System.Text.StringBuilder(); // Create a string composed of numbers 0 - 9 for (int i = 0; i < 10; i++) { sb.Append(i.ToString()); } System.Console.WriteLine(sb); // displays 0123456789 // Copy one character of the string (not possible with a System.String) sb[0] = sb[9]; System.Console.WriteLine(sb); // displays 9123456789 } }
Visual C# Consolidado
172
ESPECIFICAO DA LINGUAGEM C#
As verses 1.2 e 2.0 das especificaes da linguagem C# so a fonte autorizada de gramtica e sintaxe C#. Elas contm informaes detalhadas sobre todos os aspectos da linguagem, incluindo muitos pontos no abordados na documentao do produto Visual C#. A especificao 1.2 discute recursos que foram adicionados para a linguagem antes do Visual C# 2005 e a especificao 2.0 discute recursos que foram adicionados para o Visual C# 2005. As especificaes da linguagem C# esto disponveis no formato Microsoft Word nos seguintes locais:
No MSDN Online em http://msdn.microsoft.com/vcsharp/Programming/Language/default.aspx No Visual Studio, na pasta VC#\Specifications\1033\ sob o diretrio de instalao do seu Microsoft Visual Studio 2005 . Se voc no tiver o Microsoft Word instalado em seu computador, voc pode visualizar, copiar e imprimir a verso do Word da especificao com o gratuito Palavra visualizador 2003. A especificao da linguagem C# tambm est disponvel como um livro publicado pelo Addison Wesley.
Visual C# Consolidado
173
REFERNCIA C#
Esta seo fornece material de referncia para as palavras-chave do C#, operadores, erros de compilador e avisos.
Palavras-chave C#
Palavras-chave so identificadores reservados que tm significado especial para o compilador. Eles no podem ser usados como identificadores em seu programa a menos que incluam @ como um prefixo. Por exemplo, @if um identificador vlido mas if no, porque uma palavra-chave. abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed foat for foreach goto if implicit in int interface internal is ock ong new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackaloc static struct switch this throw true try typeof uint uong unchecked unsafe ushort using virtual volatile void while
namespace string
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.
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
Palavra-chave event
Especifica um evento. [attributes] [modifiers] e v e n t type declarator; [attributes] [modifiers] e v e n t type member-name { accessor-declarations} ; de onde: attributes (opcional) modifiers (opcional)
Modificadores opcionais, entre os que se incluem: abstract new override static virtual extern um dos quatro modificadores de acesso
type Tipo delegado ao qual se deseja associar este evento. declarator Mome do evento. Mome do evento. member-name accessor-declarations (opcional) Declarao de os descritores de acesso , os quais se utilizam para agregar ou quitar controladores de eventos no cdigo cliente. As funes para descritores de acesso so add e remove. Definir s uma de elas produza um erro. Comentarios A palavra-chave event permite especificar um delegado ao qual se invocar quando ocorra algum "evento" no cdigo. o delegado pode ter ou no o varios mtodos asociados a os que se chamar quando o cdigo indique que o evento se ha producido. possvel poner um evento de qualquer programa a disposio de outros programas que utilizem Common Language Runtime do .NET Framework. Para criar e utilizar eventos do C#, siga os seguintes pasos: Crie ou identifique um delegado. Se est definindo um evento propio, tambm deve asegurarse de que existe um delegado que possa utilizar com a palavra-chave event. Se o evento est predefinido, por Exemplo em .NET Framework, entonces os consumidores do evento s necessitan conhecer o nome do delegado. 1. Crie uma classe que contenha: a. Um evento criado desde o delegado. b. Um mtodo que comprova se existe uma instancia do delegado declarado com a palavra-chave event (este mtodo opcional). outra opo consiste em inserir este fragmento de cdigo dentro do cdigo que produza o evento.
Visual C# Consolidado
177
c. Os mtodos que chaman ao evento. Estes mtodos podem ser reemplazos de cierta funcionalidad da classe-base. Esta classe define ou evento. 2. Defina ao menos uma classe que conecte os mtodos com o evento. Cada uma de estas classes incluir o seguinte:
A asociao de uno ou varios mtodos, mediante os operadores += e -=, com o evento na classe-base. A definio de os mtodos que se asociaro com o evento. Utilize ou evento: Crie um objeto da classe que contm a declarao do evento. 3.
Crie um objeto da classe que contm a definio do evento, mediante ou construtor que definiu.
Resultado
Exemplo 1 Este Exemplo mostra que possvel declarar um evento em uma interface e implement-lo em uma classe: // event_keyword.cs using System; public delegate void MyDelegate(); // delegate declaration public interface I { event MyDelegate MyEvent; void FireAway(); } public class MyClass: I { public event MyDelegate MyEvent; public void FireAway() { if (MyEvent != null) MyEvent(); } } public class MainClass { static private void f() { Console.WriteLine("This is called whem the event fires."); } static public void Main () { I i = new MyClass(); i.MyEvent += new MyDelegate(f); i.FireAway();
Visual C# Consolidado
178
} } Exemplo 2 Uno de os usos daccessor-declarations consiste em exponer um gram nmero de eventos sem ter que assinalar um campo para cada evento, sino utilizando em seu lugar uma taba hash que almacene as instancias de os eventos. Isto s resulta til se se dispe de um gram nmero de eventos, pois se preves que a maiora de os eventos no se implementaro. // event_keyword2.cs using System; using System.Collections; public delegate void MyDelegate1(int i); public delegate void MyDelegate2(string s); public delegate void MyDelegate3(int i, object o); public delegate void MyDelegate4(); public class PropertyEventsSample { private Hashtable eventTable = new Hashtable(); public event MyDelegate1 Event1 { add { eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] + value; } remove { eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] - value; } } public event MyDelegate1 Event2 { add { eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] + value; } remove { eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] - value; } } public event MyDelegate2 Event3 { add { eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] + value; } remove { eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] - value; }
Visual C# Consolidado
179
} public event MyDelegate3 Event4 { add { eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] + value; } remove { eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] - value; } } public event MyDelegate3 Event5 { add { eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] + value; } remove { eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] - value; } } public event MyDelegate4 Event6 { add { eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] + value; } remove { eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] - value; } } } public class MyClass { public static void Main() { } } Exemplo 3 Outro uso das propriedades de eventos contempla o caso no que se implementam duas interfaces, cada uma com um evento do mesmo nome. Nesse caso, deve utilizar uma propriedade de evento de implementao explcita: // event_keyword3.cs using System; public delegate void MyDelegate1(); public interface I1
Visual C# Consolidado
180
{ event MyDelegate1 MyEvent; } public delegate int MyDelegate2(string s); public interface I2 { event MyDelegate2 MyEvent; } public class ExplicitEventsSample: I1, I2 { public event MyDelegate1 MyEvent; // normal implementation of I1.MyEvent. event MyDelegate2 I2.MyEvent // explicit implementation of I2.MyEvent { add { MyEvent2Storage += value; } remove { MyEvent2Storage -= value; } } private MyDelegate2 MyEvent2Storage; // underlying storage for I2.MyEvent. private void FireEvents() { if (MyEvent != null) MyEvent(); if (MyEvent2Storage != null) MyEvent2Storage("helo"); } } public class MyClass { public static void Main() { } }
Palavra-chave new
Em C#, a palavra-chave new pode utilizar como operador ou como modificador.
Operador new utilizado para criar objetos na pilha e invocar construtores. Modificador new utilizado para ocultar um membro herdado de um membro de classe-
base.
OPERADOR NEW
O operador new utilizado para criar objetos e invocar construtores, por exemplo: Class1 MyClass = new Class1();
Visual C# Consolidado
181
Tambm utilizado com o fim de invocar o construtor predeterminado para tipos de valores, por exemplo: int myInt = new int(); Na instruo anterior se inicializa myInt com o valor 0, que ou predeterminado para o tipo int. Essa instruo tno mesmo efeito que: int myInt = 0; Lembre que um erro declarar um construtor predeterminado para um tipo struct, j que todos os tipos de valores posuem implcitamente um construtor pblico predeterminado. No obstante, se podem se declarar construtores com parmetros para um tipo struct. Os objetos do tipo valor, tais como as estruturas, so criados na pilha, enquanto que os objetos do tipo referencia, tais como as classes, so criados na pilha. O operador new no pode sobrecargar. Se o operador new fala na assinalao de memoria, iniciar a exceo OutOfMemoryException. Exemplo No seguinte exemplo, so criados e se inicializam, mediante o operador new, um objeto struct e um objeto class y, a continuao, se lhes assinalam valores. Os valores predeterminados e assinalados se mostram em tela. // cs_operator_new.cs // The new operator using System; class NewTest { struct MyStruct { public int x; public int y; public MyStruct (int x, int y) { this.x = x; this.y = y; } } class MyClass { public string name; public int id; public MyClass () { }
Visual C# Consolidado
182
public MyClass (int id, string name) { this.id = id; this.name = name; } } public static void Main() { // Criate objects using default construtors: MyStruct Ocation1 = new MyStruct(); MyClass Empoyee1 = new MyClass(); // Display values: Console.WriteLine("Default values:"); Console.WriteLine(" Struct members: {0}, {1}", Ocation1.x, Ocation1.y); Console.WriteLine(" Class members: {0}, {1}", Empoyee1.name, Empoyee1.id); // Criate objects using parameterized construtors:: MyStruct Ocation2 = new MyStruct(10, 20); MyClass Empoyee2 = new MyClass(1234, "John Martin Smith"); // Display values: Console.WriteLine("Assigned values:"); Console.WriteLine(" Struct members: {0}, {1}", Ocation2.x, Ocation2.y); Console.WriteLine(" Class members: {0}, {1}", Empoyee2.name, Empoyee2.id); } }
Resultado
Default values: Struct members: 0, 0 Class members: , 0 Assigned values: Struct members: 10, 20
Visual C# Consolidado
183
Class members: John Martin Smith, 1234 Observe no Exemplo que o valor predeterminado de uma srie null. Por tanto, no se mostra em tela.
MODIFICADOR NEW
Use o modificador new para ocultar explcitamente um membro herdado de uma classe-base. Para ocultar um membro herdado, declare-o na classe derivada com o mesmo mome e modifiqueo com o modificador new. Considere a seguinte classe: public class MyBaseC { public int x; public void Invoke() {} } Ao declarar um membro com o nome Invoke em uma classe derivada se ocultar o mtodo Invoke na classe-base, assim: public class MyDerivedC : MyBaseC { new public void Invoke() {} } Mas, o campo x no ser afetado, j que no oculta nenhum mome similar. A ocultao de nomes por meio da herana toma uma das seguintes formas:
Constante, campo, propriedade ou tipo introduzido em uma classe ou estrutura que oculta todos os membros da classe-base com o mesmo nome. Mtodo introduzido em uma classe o estrutura que oculta propriedades, campos e tipos, com o mesmo nome, na classe-base. Tambm oculta todos os mtodos da classe-base com a mesma firma. Para obter mais informao, veja 3.6 Firmas e sobrecarga. Indicador introduzido em uma classe o estrutura que oculta todos os indicadores da classebase com a mesma firma. incorreto utilizar simultneamente new e override no mesmo membro.
Se utilizada o modificador new em uma declarao que no oculta um membro herdado, se gera uma advertencia. Exemplo Neste exemplo, uma classe-base, MyBaseC, e uma classe derivada, MyDerivedC, utilizam o mesmo mome de campo x, o que produza a ocultao do valor do campo herdado. o Exemplo demostra o uso do modificador new. Tambm mostra como obter acesso a os membros ocultos da classe-base mediante sus nomes completos. // cs_modifier_new.cs // The new modifier using System; public class MyBaseC { public static int x = 55;
Visual C# Consolidado
184
public static int e = 22; } public class MyDerivedC : MyBaseC { new public static int x = 100; // Name hiding public static void Main() { // Display the overlapping value of x: Console.WriteLine(x); // Access the hiddem value of x: Console.WriteLine(MyBaseC.x); // Display the unhiddem member y: Console.WriteLine(y); } }
Resultado
100 55 22 Se elimina o modificador new, ou programa seguir compilndose e executndose, pois se obter a advertencia: The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'. Tambm pode utilizar o modificador new para modificar um tipo anidado, Se o tipo anidado est ocultando outro tipo, como se mostra no seguinte exemplo. Exemplo Neste exemplo, uma classe anidada, MyClass, oculta uma classe com o mesmo mome na classebase. o Exemplo demostra o uso do modificador new para eliminar ou mensagem dadvertencia, assim como ou acesso a os membros da classe oculta mediante sus nomes completos. // cs_modifer_new_nested.cs // Using the new modifier with nested types using System; public class MyBaseC { public class MyClass { public int x = 200; public int y;
Visual C# Consolidado
185
} } public class MyDerivedC : MyBaseC { new public class MyClass // nested type hiding the base type members { public int x = 100; public int y; public int z; } public static void Main() { // Criating object from the overlapping class: MyClass S1 = new MyClass(); // Criating object from the hiddem class: MyBaseC.MyClass S2 = new MyBaseC.MyClass(); Console.WriteLine(S1.x); Console.WriteLine(S2.x); } }
Resultado
100 200
PALAVRA-CHAVE STRUCT
Um tipo struct um tipo de valor que pode conter construtores, constantes, campos, mtodos, propriedades, indicadores, operadores, eventos e tipos anidados. A declarao de um tipo struct toma a forma seguinte: [attributes] [modifiers] s t r u c t identifier [: interfaces] body [; ] de onde: attributes (opcional) Informao declarativa adicional. Para obter mais informao sobre os atributos e as classes datributo, veja 17. Atributos. modifiers (opcional)
Visual C# Consolidado
186
Os modificadores permitidos so new e os cuatro modificadores de acesso . identifier Mome do tipo struct. interfaces (opcional) body Cuerpo da estrutura que contm as declaraes de os membros. Comentarios O tipo struct adequado para representar objetos de poca complejidad, como puntos, rectnguos e cores. Mas possvel representar um ponto como uma classe, uma estrutura mais eficaz em algunos casos. Por exemplo, se se declara uma matriz de 1000 objetos Point, se deber assinalar memoria adicional para fazer referencia a cada objeto. Neste caso, a estrutura apresenta um menor costo. um erro declarar um construtor predeterminado (sin parmetros) para uma estrutura. Siempre existe um construtor predeterminado que inicializa os membros da estrutura com sus valores predeterminados. um erro inicializar um campo de instancia de uma estrutura. Quando se cria um objeto struct mediante o operador new, se cria e se chama ao construtor apropriada. A diferena das classes, podem se criar instancias das estruturas sem utilizar o operador new. Se no utilizado new, os campos permanecero sem assinalar e ou objeto no se poder utilizar at haver inicializado todos os campos. A diferena das classes, para as estruturas no existe herana. uma estrutura no pode heredar de outra estrutura ou classe, nem pode ser a base de uma classe. Sem embargo, as estruturas herdam da classe-base Object. uma estrutura pode implementar interfaces do mesmo modo que as classes. A diferena de C++, no pode declarar uma classe mediante a palavra-chave struct. Em C#, as classes e as estruturas so semnticamente diferentes. uma estrutura um tipo de valor, enquanto que uma classe um tipo de referencia. A menos que se necessite semntica de tipos de referencia, o sistema pode processar uma classe que ocupe menos de 16 bytes de forma mais eficaz como estrutura. Para obter mais informao sobre estruturas, veja 11. Estruturas e ou Tutorial de estruturas. Em as extenses administradas para C++, os equivalentes a uma classe do C# e a uma estrutura do C# so os seguintes: C# class Extenses administradas para C++ __gc struct ou __gc class __value struct ou __value class Para obter mais informao... palavra chave __gc Lista que contm as interfaces implementadas pela estrutura, todas separadas por comas.
struct
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#.
// cmdll.c // compile with: /LD /MD int __declspec(dllexport) MyMethod(int i) { return i*10; }
Arquivo CM.cs
// cm.cs using System; using System.Runtime.InteropServices; public class MyClass { [DllImport("Cmdll.dll")] public static extern int MyMethod(int x); public static void Main() { Console.WriteLine("MyMethod() returns {0}.", MyMethod(5)); } }
Resultado
MyMethod() returns 50.
Compilao
Para gerar ou proyecto, siga estes pasos:
Compile Cmdll.c como uma DLL mediante a lnea de comandos de Visual C++: Compile CM.cs mediante a lnea de comandos:
cl /LD /MD Cmdll.c csc CM.cs Desta forma, se criar o arquivo executable CM.exe. Quando execute este programa, MyMethod passar o valor 5 ao arquivo DLL, o qual devoltar o valor multiplicado por 10.
Palavra-chave object
O tipo object um alias de System.Object do .NET Framework. As variveis do tipo object podem receber valores de qualquer tipo. Todos os tipos de dados, predefinidos e definidos pelo usuario, herdam da classe System.Object. ou tipo de dados object ou tipo hacia o qual e desde o qual os objetos se conviertem mediante boxing. Exemplo O seguinte Exemplo mostra como as variveis do tipo object podem aceitar valores de qualquer tipo de dados e como podem utilizar mtodos de System.Object procedentes do .NET Framework. // keyword_object.cs using System; public class MyClass1 { public int i = 10;
Visual C# Consolidado
197
} public class MyClass2 { public static void Main() { object a; a = 1; // an example of boxing Console.WriteLine(a); Console.WriteLine(a.GetType()); Console.WriteLine(a.ToString()); Console.WriteLine(); a = new MyClass1 (); MyClass1 ref_MyClass1; ref_MyClass1 = (MyClass1)a; Console.WriteLine(ref_MyClass1.i); } }
Resultados
1 System.Int32 1 10
Palavra-chave this
A palavra-chave this faz referencia instancia atual da classe. As funes membro estticas no apresentam um ponteiro this. Esta palavra-chave this pode ser utilizada para obter acesso a membros desde construtores, mtodos de instancia e descritores de acesso de instancias. A continuao, se indicam algunos usos comunes de this: Obter acesso a membros com o fim de evitar ambigedades com nomes similares, por exemplo: public Empoyee(string name, string alias) { this.name = name; this.alias = alias; } Passar um objeto como parmetro a outros mtodos, por exemplo, para: Declarar indicadores, por exemplo: CalcTax(this); public int this [int param] { get { return array[param]; } set {
Visual C# Consolidado
198
array[param] = value; } } incorreto fazer referencia a this em um mtodo esttico, em um descritor de acesso a uma propriedade esttica ou em um inicializador de varivel de uma declarao de campo. Exemplo Neste exemplo, this utilizado para obter acesso a os membros da classe Empoyee, name e alias, que apresentam ambigedad com nomes similares. Tambm utilizado para passar um objeto ao mtodo CalcTax, o qual pertence a outra classe. // keywords_this.cs // this example using System; public class Empoyee { public string name; public string alias; public decimal salary = 3000.00m; // Construtor: public Empoyee(string name, string alias) { // Use this to qualify the fields, name and alias: this.name = name; this.alias = alias; } // Printing method: public void printEmpoyee() { Console.WriteLine("Name: {0}\nAlias: {1}", name, alias); // Passing the object to the CalcTax method by using this: Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this)); } } public class Tax { public static decimal CalcTax(Empoyee E) { return (0.08m*(E.salary)); } } public class MainClass { public static void Main() { // Criate objects: Empoyee E1 = new Empoyee ("John M. Trainer", "jtrainer"); // Display results: E1.printEmpoyee(); }
Visual C# Consolidado
199
Resultado
Name: John M. Trainer Alias: jtrainer Taxes: $240.00
Palavra-chave bool
A palavra-chave bool um alias de System.Boolean. utilizado para declarar variveis que armazenam os valores booleanos true e false. Literais possvel assinalar um valor booleano a uma varivel do tipo bool, por exemplo: bool MyVar = true; Tambm pode assinalar uma expresso que se avalie como bool a uma varivel do tipo bool, por exemplo: bool Alphabetic = (c > 64 && c < 123); Converses Em C++, um valor do tipo bool pode converter em um valor do tipo int; assim: false equivale a cero e true equivale a valores distintos de cero. Em C#, no possvel realizar a converso do tipo bool a outros tipos ou viceversa. Por exemplo, a seguinte instruo if no vlida em C#, mas se o em C++: int x = 123; if (x) // Invalid in C# { printf("The value of x is nonzero."); } Para provar uma varivel do tipo int, tem que comparara explcitamente com um valor (por exemplo, cero); assim: int x = 123; if (x != 0) // The C# way { Console.Write("The value of x is nonzero."); } Exemplo Neste exemplo, se escreve um carcter desde ou teclado e ou programa comprova se se trata de uma letra. Nesse caso, comprova se minscula ou maiscula. Em cada caso, se mostra a mensagem apropriada. // keyword_bool.cs // Character Tester using System; public class BoolTest { public static void Main() { Console.Write("Enter a character: "); char c = (char) Console.Read(); if (Char.IsLetter(c))
Visual C# Consolidado
200
if (Char.IsOwer(c)) Console.WriteLine("The character is owercase."); else Console.WriteLine("The character is uppercase."); else Console.WriteLine("The character is not an alphabetic character."); } } Entrada X
Resultados do Exemplo
Enter a character: X The character is uppercase. Sucesivas execues de Exemplo podran ter este aspecto: Enter a character: x The character is owercase. Enter a character: 2 The character is not an alphabetic character.
Palavra-chave false
Em C#, a palavra-chave false pode utilizar como um operador sobrecarregado ou como um literal.
OPERADOR FALSE
Em os tipos definidos pelo usuario pode definir um operador false que devolve o valor do tipo bool true para indicar um valor lgico falso; caso contrario, devolve false. Isto resulta til para tipos que representam valores true, false e null (nem true nem false), como os utilizados em base de dados. Esses tipos podem se utilizar em as expresses de controle das instrues if, do, while e for, assim como em expresses condicionales. Se um tipo define false como operador, tambm deve definir true como operador. Um tipo no pode sobrecarregar diretamente os operadores lgicos condicionais (&& e ||), pois pode conseguir um efeito equivalente se se sobrecarrega os operadores lgicos normais e os operadores true e false (veja 7.11.2 Operadores lgicos condicionais definidos pelo usuario). Exemplo Veja o Exemplo de 11.4.2 Tipo boolean para base de dados.
FALSE (LITERAL)
A palavra-chave false um literal do tipo bool que reapresenta o valor lgico "falso". Exemplo // cs_keyword_false.cs using System;
Visual C# Consolidado
201
class test { public static void Main() { bool a = false; Console.WriteLine( a ? "yes" : "no" ); } }
Resultado
no
Palavra-chave operator
A palavra-chave operator utilizado para declarar um operador em uma declarao de classe o estrutura. uma declarao de operador pode apresentar uma das seguintes cuatro formas: p u b l i c s t a t i c result-type o p e r a t o r unary-operator ( op-type operand ) p u b l i c s t a t i c result-type o p e r a t o r binary-operator ( op-type operand, op-type2 operand2 ) p u b l i c s t a t i c i m p l i c i t o p e r a t o r conv-type-out ( conv-type-in operand ) p u b l i c s t a t i c e x p l i c i t o p e r a t o r conv-type-out ( conv-type-in operand ) de onde: result-type Tipo do resultado do operador. true false unary-operator Uno de os seguintes: + - ! ~ ++ op-type Tipo do primeiro (o nico) parmetro. Mome do primeiro (o nico) parmetro. ^ << >> == != > < >= <= operand binary-operator Uno de os seguintes: op-type2 Tipo do segundo parmetro. Mome do segundo parmetro. Tipo de destino de um operador de converso de tipos. Tipo de entrada de um operador de converso de tipos. operand2 conv-type-out conv-type-in
Visual C# Consolidado
202
Comentarios As dos primeras formas declaram operadores definidos pelo usuario que sobrecarrega operadores integrados. Tenga em cuenta que no todos os operadores integrados podem sobrecargarse (veja Operadores sobrecargables). Ao menos uno de os tipos op-type e op-type2 deve ser ou tipo contenedor (assim, ou tipo do qual membro ou operador). De este modo, por exemplo, se evita ter que redefinir o operador dadio de inteiros. As dos ltimas formas declaram operadores de conversin. S uno de os tipos conv-type-in e conv-type-out deve ser ou tipo contenedor (assim, um operador de converso s pode realizar converses de seu tipo contenedor a outro tipo, ou de outro tipo a seu tipo contenedor). Os operadores s podem tomar parmetros de valor, no parmetros ref ou out. Qualquer declarao de operador pode estar precedida por uma lista opcional de atributos. Exemplo A continuao, se mostra uma classe muy simplificada para nmeros racionales. Sobrecarga os operadores + e * para implementar a adio e multiplicao de nmeros fraccionarios, e tambm proporciona um operador que convierte fraces em nmeros reales do tipo double. // cs_keyword_operator.cs using System; class Fraction { int num, den; public Fraction(int num, int den) { this.num = num; this.dem = den; } // overoad operator + public static Fraction operator +(Fraction a, Fraction b) { return new Fraction(a.num * b.dem + b.num * a.den, a.dem * b.den); } // overoad operator * public static Fraction operator *(Fraction a, Fraction b) { return new Fraction(a.num * b.num, a.dem * b.den); } // define operator double public static implicit operator double(Fraction f) { return (double)f.num / f.den; } } class Test { public static void Main() { Fraction a = new Fraction(1, 2); Fraction b = new Fraction(3, 7);
Visual C# Consolidado
203
Resultado
0.880952380952381
Palavra-chave throw
A instruo throw utilizado para sealizar a apario de uma situao anmaa (exceo) durante a execuo do programa. Apresenta a seguinte forma: t h r o w [expression]; de onde: expression O objeto exceo. Este elemento se omite se se vuelve a iniciar ou objeto de exceo atual em uma clusula catch. Comentarios A exceo provocada um objeto cuja classe derivada de System.Exception, por exemplo: class MyException : System.Exception {} throw new MyException(); Normalmente, a instruo throw utilizado com as instrues try-catch ou try-finally. Quando se provoca uma exceo, ou programa busca a instruo catch que controa esa exceo. Tambm pode voltar a iniciar uma exceo detectada mediante a instruo throw. Exemplo Este Exemplo mostra como provocar uma exceo mediante a instruo throw. // throw example using System; public class ThrowTest { public static void Main() { string s = null; if (s == null) { throw(new ArgumentNullException()); } Console.Write("The string s is null"); // not executed } }
Resultado
Se produza a exceo seguinte: System.ArgumentNullException
Visual C# Consolidado
204
Palavra-chave break
A instruo break permite terminar a instruo switch ou o lao envolvente em os quais aparece. o controle se transfere instruo que sigue instruo terminada, se existe alguna. A instruo apresenta a seguinte forma: break; Exemplo Neste exemplo, a instruo condicional contm um contador preparado para contar de 1 a 100; sem embargo, a instruo break termina ou lao tras 4 iteraes. // statements_break.cs using System; class BreakTest { public static void Main() { for (int i = 1; i <= 100; i++) { if (i == 5) break; Console.WriteLine(i); } } }
Resultado
1 2 3 4 Exemplo Este Exemplo mostra o uso de break em uma instruo switch. // statements_break2.cs // break and switch using System; class Switch { public static void Main() { Console.Write("Enter your selection (1, 2, or 3): "); string s = Console.ReadLine(); int n = Int32.Parse(s); switch(n) { case 1: Console.WriteLine("Current value is {0}", 1); break; case 2: Console.WriteLine("Current value is {0}", 2); break;
Visual C# Consolidado
205
case 3: Console.WriteLine("Current value is {0}", 3); break; default: Console.WriteLine("Sorry, invalid selection."); break; } } } Entrada 1
Resultados do Exemplo
Enter your selection (1, 2, or 3): 1 Current value is 1 Se se escreveu 4, ou resultado sera: Enter your selection (1, 2, or 3): 4 Sorry, invalid selection.
Palavra-chave try-finally
O bloco finally til para liberar os recursos assinalados no bloco try. o controle se transfere siempre ao bloco finally independientemente de como finalice o bloco try. A instruo apresenta a seguinte forma: t r y try-bock f i n a l l y finally-bock de onde: try-bock Contm o segmento de cdigo que pode produzir a exceo. Contm o controlador da exceo e ou cdigo que realiza a liberao de recursos. finally-bock Comentarios Se biem catch utilizado para controlar excees que ocurrem em um bloco de instruces, finally utilizado para garantizar que um bloco de cdigo se executa independientemente de como finaliza o bloco try anterior. Exemplo Neste exemplo, existe uma instruo de converso no vlida que produza uma exceo. Se se executa ou programa, se obtem um mensagem de erro em tiempo de execuo, pois a clusula finally se executa de todas formas e mostra o resultado. // try-finally using System; public class TestTryFinally { public static void Main() { int i = 123; string s = "Some string"; object ou = s;
Visual C# Consolidado
206
try { // Invalid conversion; ou contains a string not an int i = (int) o; } finally { Console.Write("i = {0}", i); } } }
Resultado
Se produza a exceo seguinte: System.InvalidCastException Mas se captur uma exceo, a instruo de salida incluida no bloco finally se executar de todas formas, assim: i = 123 Para obter mais informao acerca de finally, veja try-catch-finally.
Palavra-chave out
A palavra-chave out aplicada a parmetros de mtodos faz que um mtodo haga referencia varivel pasada ao mtodo. Qualquer cambio que se realice no parmetro dentro do mtodo se reflejar em esa varivel quando se devuelva o controle ao mtodo que realiz a chamada. Declarar um mtodo como out til quando se deseja que devuelva varios valores. um mtodo que utiliza um parmetro out puede, no obstante, seguir devolviendo um valor. um mtodo pode ter mais de um parmetro out. Para utilizar um parmetro out, ou argumento deve passarse explcitamente ao mtodo como um argumento out. o valor de um argumento out no se passar ao parmetro out. Uma varivel que se pasa como argumento out no necessita inicializarse. No obstante, deve assinalarse um valor ao parmetro out antes de que o mtodo devuelva a chamada. Uma propriedade no uma varivel y, por tanto, no pode passar como parmetro out. Se as declaraes de dois mtodos s se diferenan no uso de out, existir sobrecarga. Sem embargo, no possvel definir uma sobrecarga que s se diferencie em ref e out. Por exemplo, as seguintes declaraes de sobrecarga so vlidas: class MyClass { public void MyMethod(int i) {i = 10;} public void MyMethod(out int i) {i = 10;} } pois as seguintes no o son: class MyClass { public void MyMethod(out int i) {i = 10;} public void MyMethod(ref int i) {i = 10;} } Exemplo
Visual C# Consolidado
207
// cs_out.cs using System; public class MyClass { public static int TestOut(out char i) { i = 'b'; return -1; } public static void Main() { char i; // varivel need not be initialized Console.WriteLine(TestOut(out i)); Console.WriteLine(i); } }
Resultado
-1 b
Palavra-chave true
Em C#, a palavra-chave true pode utilizar como um operador sobrecarregado ou como um literal:
OPERADOR TRUE
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
Resultado
yes
Palavra-chave byte
A palavra-chave byte denota um tipo integral que armazena valores segundo se indica na taba seguinte. Tipo byte Literais As variveis do tipo byte podem se declarar e inicializar como no seguinte exemplo: byte myByte = 255; Na declarao anterior, ou literal inteiro 255 se convierte implcitamente do tipo int ao tipo byte. Se o literal inteiro supera ou intervalo de valores do tipo byte, se produzir um erro de compilao. Converses Existe uma converso implcita predefinida de byte a short, ushort, int, uint, ong, uong, foat, double ou decimal. No podem se converter implcitamente tipos numricos no literais cujo tamanho darmazenamiento seja superior a byte (veja Tabela de tipos integrais para conhecer os tamanhos darmazenamiento de os tipos integrais). Considere, por exemplo, as dos seguintes variveis do tipo byte, x e y: byte x = 10, e = 20; A instruo dassinalao seguinte produzir um erro de compilao, j que a expresso aritmtica do lado direito do operador dassinalao se avalie de forma predeterminada como int. byte z = x + y; // Erro: conversion from int to byte Para solucionar este problema, utilize uma converso explcita: byte z = (byte)(x + y); // OK: explicit conversion Mas, possvel utilizar as instrues seguintes, de onde a varivel de destino tem um tamanho darmazenamiento igual ou superior: int x = 10, e = 20; int m = x + y; ong n = x + y; Intervalo 0 a 255 Tamanho Inteiro de 8 bits sem signo Tipo do .NET Framework System.Byte
Visual C# Consolidado
209
Assim mesmo, no existe converso implcita de tipos de ponto flutuante a tipo byte. Por exemplo, a instruo seguinte gerar um erro de compilao, a menos que se utilize uma converso explcita: byte x = 3.0; // Erro: no implicit conversion from double byte e = (byte)3.0; // OK: explicit conversion Para chamar os mtodos sobrecarregados, deve se utilizar uma converso explcita de tipos. Considere, por exemplo, os dos seguintes mtodos sobrecarregados que utilizam parmetros do tipo byte e int: public static void MyMethod(int i) {} public static void MyMethod(byte b) {} Se utilizada a converso ao tipo byte, se garante a chamada ao tipo correto; por exemplo: MyMethod(5); // Calling the method with the int parameter MyMethod((byte)5); // Calling the method with the byte parameter Para obter mais informao sobre expresses aritmticas com tipos de ponto flutuante e tipos integrais, veja foat e double. Para obter mais informao sobre as regas de converso numrica implcitas, veja a Taba de converses numricas implcitas.
Palavra-chave fixed
Impide que o recolector de elementos no utilizados cambie a colocao de uma varivel. Apresenta a seguinte forma: f i x e d ( type* ptr = expr ) statement de onde: type Tipo no administrado ou tipo void. ptr expr Expresso que pode converter implcitamente em um tipo type*. statement Instruo o bloco executable. Comentarios A instruo fixed s se permite em um contexto unsafe. A instruo fixed establece um ponteiro em uma varivel administrada e "fija" esa varivel durante a execuo da instruo o bloco statement. Sem fixed, os ponteiros a variveis administradas seran de poca utilidad, j que o proceso de recoleo de elementos no utilizados poderia cambiar a colocao das variveis de forma impredecible. De hecho, ou compilador do C# no permite definir um ponteiro a uma varivel administrada se no em uma instruo fixed. // assume class Point { public int x, y; } Point pt = new Point(); // pt is a managed varivel, subject to g.c. fixed ( int* p = &pt.x ){ // must use fixed to get address of pt.x and *p = 1; // pin pt in place while we use the pointer } Um ponteiro pode inicializar com a direo de uma matriz ou de uma srie: Mome de ponteiro.
Visual C# Consolidado
210
fixed (int* p = arr) ... // equivalent to p = &arr[0] fixed (char* p = str) ... // equivalent to p = &str[0] Se podem inicializar varios ponteiros vez, siempre que sean do mesmo tipo: fixed (byte* ps = srcarray, pd = dstarray) {...} Para inicializar ponteiros de diferente tipo, simplemente anide instrues fixed: fixed (int* p1 = &p.x) fixed (double* p2 = &array[5]) // do something with p1 and p2 Os ponteiros inicializados em instrues fixed no podem se modificar. Depois de executar a instruo o bloco statement, qualquer varivel anteriormente fijada queda j sometida ao proceso de recoleo de elementos no utilizados. Por consiguiente, no deve apuntar a esas variveis desde fora da instruo fixed. no modo no seguro (unsafe), pode assinalar memoria pilha, de onde no est sometida a recoleo de elementos no utilizados y, por o tanto, no necessita fijarse. Veja stackaloc para obter mais informao. Exemplo // statements_fixed.cs // compile with: /unsafe using System; class Point { public int x, y; } class FixedTest { // unsafe method: takes pointer to int unsafe static void SquarePtrParam (int* p) { *p *= *p; } unsafe public static void Main() { Point pt = new Point(); pt.x = 5; pt.y = 6; // pin pt in place: fixed (int* p = &pt.x) { SquarePtrParam (p); } // pt now unpinned Console.WriteLine ("{0} {1}", pt.x, pt.y); } }
Resultado
25 6
Visual C# Consolidado
211
Palavra-chave override
Utilize o modificador override para modificar um mtodo, uma propiedad, um indicador ou um evento. Os mtodos de reemplazo proporcionam uma nueva implementao de um membro herdado de uma classe-base. ou mtodo substitudo por uma declarao override se conhece como mtodo base reemplazado. ou mtodo base substitudo deve ter a mesma firma que o mtodo de reemplazo. No pode substituir um mtodo esttico ou no virtual. ou mtodo base substitudo deve ser virtual, abstract u override. Uma declarao override no pode cambiar a accesibilidad do mtodo virtual. Tanto ou mtodo de reemplazo como ou mtodo virtual devem ter o mesmo modificador de nivo de acesso . No podem se utilizar os seguintes modificadores para modificar um mtodo de reemplazo: new static virtual abstract Uma declarao de propriedade de reemplazo deve especificar o mesmo modificador de acesso , tipo e mome que a propriedade herdada, e a propriedade reemplazada deve ser virtual, abstract u override. Para obter mais informao acerca do acesso a os membros de uma classe-base, veja 7.5.8 acesso base. Para obter mais informao sobre como substituir mtodos, veja 10.5.4 Mtodos de reemplazo. Exemplo Veja o Exemplo correspondiente da palavra-chave virtual. Desde dentro da classe derivada que posee um mtodo de reemplazo, an possvel ter acesso , mediante a palavra-chave base, ao mtodo base substitudo que tno mesmo nome. Por exemplo, se se dispe de um mtodo virtual MyMethod(), e um mtodo de reemplazo em uma classe derivada, pode obter acesso ao mtodo virtual desde a classe derivada mediante a chamada: base.MyMethod() Compare esta opo com a de C++, de onde utilizado o operador de resoluo de mbito (::) e o nome da classe-base, por exemplo: My_Base_Class_Name::MyMethod() Exemplo Neste exemplo, existe uma classe-base, Square, e uma classe derivada, Cube. Como a rea de um cubo a soma das reas de seis quadrados, possvel calcular mediante uma chamada ao mtodo Area() da classe-base. // cs_override_keyword.cs // Calling overridem methods from the base class using System; class TestClass { public class Square { public double x; // Construtor: public Square(double x) { this.x = x; }
Visual C# Consolidado
212
public virtual double Area() { return x*x; } } class Cube: Square { // Construtor: public Cube(double x): base(x) { } // Calling the Area base method: public override double Area() { return (6*(base.Area())); } } public static void Main() { double x = 5.2; Square s = new Square(x); Square c = new Cube(x); Console.WriteLine("Area of Square = {0:F2}", s.Area()); Console.WriteLine("Area of Cube = {0:F2}", c.Area()); } }
Resultado
Area of Square = 27.04 Area of Cube = 162.24
Palavra-chave try-catch
A instruo try-catch consta de um bloco try seguido de uma ou mais clusulas catch, as quais especificam controladores para diferentes excees . Esta instruo apresenta uma das seguintes formas: t r y try-bock c a t c h ( exception-declaration-1) catch-bock-1 c a t c h ( exception-declaration-2) catch-bock-2 ... t r y try-bock c a t c h catch-bock de onde: try-bock Contm o segmento de cdigo que pode produzir a exceo. Declarao do objeto exceo. Contm o controlador da exceo. exception-declaration, exception-declaration-1, exception-declaration-2 catch-bock, catch-bock-1, catch-bock-2 Comentarios
Visual C# Consolidado
213
O bloco try-bock Contm o bloco de cdigo suceptvel de causar a exceo. Este bloco se executa at que se produza uma exceo ou at completarse satisfatoriamente. Por exemplo, ou seguinte intento de converter o tipo de um objeto null provoca a exceo NullReferenceException: object o2 = null; try { int i2 = (int) o2; // Erro } A clusula catch pode utilizar sem argumentos, em cujo caso captura qualquer tipo de exceo e se conhece como clusula catch geral. Tambm pode aceitar um argumento de objeto derivado de System.Exception, em cujo caso trata uma exceo especfica. Por exemplo: catch (InvalidCastException e) { } possvel utilizar mais de uma clusula catch especfica na mesma instruo try-catch. Neste caso, a ordem das clusulas catch importante j que estas se examinam por ordem. As excees mais especficas se capturam ant que as menos especficas. Se pode utilizar uma instruo throw no bloco catch para voltar a provocar a exceo capturada pela instruo catch. Por exemplo: catch (InvalidCastException e) { throw (e); // Rethrowing exception e } Se deseja voltar a provocar a exceo que est sendo atualmente controlada por uma clusula catch sem parmetros, use a instruo throw sem argumentos. Por exemplo: catch { throw; } Quando estes dentro de um bloco try, inicialice s variveis declaradas em seu interior; caso contrario, pode provocarse uma exceo ant de que se complete a execuo do boque. Por exemplo, no seguinte Exemplo de cdigo, a varivel x se inicializa dentro do bloco try. Ao intentar utilizar a varivel fora do bloco try, na instruo Write(x), se gerar ou seguinte erro do compilador: Uso de varivel ocal no assinalada. public static void Main() { int x; try { x = 123; // Don't do that. // ... } catch { // ... } Console.Write(x); // Erro: Use of unassigned ocal varivel 'x'. }
Visual C# Consolidado
214
Exemplo Neste exemplo, o bloco try contm uma chamada ao mtodo MyFn(), que pode produzir uma exceo. A clusula catch Contm o controlador da exceo, o qual simplemente mostra um mensagem na tela. Quando se realiza a chamada instruo throw desde dentro de MyFn(), o sistema busca a instruo catch e mostra a mensagem Exception caught. // Rethrowing exceptions: using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); } } public void MyFn(string s) { if (s == null) throw(new ArgumentNullException()); } }
Resultado
Se produza a exceo seguinte: System.ArgumentNullException Exemplo Neste exemplo, se utilizam dos instrues catch. A exceo mais especfica, que aparece em primeiro lugar, se captura primero. // Ordering catch clauses using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } // Most specific: catch (ArgumentNullException e)
Visual C# Consolidado
215
{ Console.WriteLine("{0} First exception caught.", e); } // Least specific: catch (Exception e) { Console.WriteLine("{0} Second exception caught.", e); } } public void MyFn(string s) { if (s == null) throw new ArgumentNullException(); } }
Resultado
Se produza a exceo seguinte: System.ArgumentNullException No Exemplo anterior, se empieza com a clusula catch menos especfica, se obter o mensagem: A previous catch clause already catch all exceptions of this or a super type ('System.Exception') No obstante, para capturar a exceo menos especfica, deve substituir a instruo throw pela seguinte: throw new Exception();
Palavra-chave switch
A instruo switch uma instruo de controle que permite manejar varias selees e passar o controle a uma das instrues case de seu cuerpo. Apresenta a seguinte forma: s w i t c h ( expression) { c a s e constant-expression: statement jump-statement [d e f a u l t : statement jump-statement] } De onde: expression Expresso do tipo integral ou srie. statement Instrues que se devem executar se se transfere o controle etiqueta caSe o default. jump-statement Instruo de salto que transfere o controle fora do corpo case. constant-expression
Visual C# Consolidado
216
O controle se transfere a uma instruo case especfica segundo o valor desta expresso. Comentarios O controle se transfere instruo case cuja constante constant-expression coincide com a expresso expression. A instruo switch pode incluir qualquer nmero de elementos case, pois no pode haver dos constantes case com o mesmo valor em uma mesma instruo switch. A execuo do corpo da instruo empieza na instruo selecionada e contina at que a instruo de salto jump-statement transfere o controle fora do corpo case. Observe que necessrio colocar jump-statement ao final de cada boque, incluido ou ltimo boque, j seja uma instruo caSe o uma instruo default. A diferena da instruo switch de C++, C# no admite ou paso explcito de uma etiqueta case a outra. Se o deseja, pode utilizar goto a uma etiqueta caSe o goto default. Se expression no coincide com nenhuma constante constant-expression, o controle se transfere s instrues que seguem etiqueta default opcional. Se no existe uma etiqueta default, o controle se transfere fora da instruo switch. Exemplo // statements_switch.cs using System; class SwitchTest { public static void Main() { Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large"); Console.Write("Please enter your selection: "); string s = Console.ReadLine(); int n = int.Parse(s); int cost = 0; switch(n) { case 1: cost += 25; break; case 2: cost += 25; goto case 1; case 3: cost += 50; goto case 1; default: Console.WriteLine("Invalid selection. Please select 1, 2, or 3."); break; } if (cost != 0) Console.WriteLine("Please insert {0} cents.", cost); Console.WriteLine("Thank you for your business."); } } Entrada 2
Visual C# Consolidado
217
Resultados do Exemplo
Coffee sizes: 1=Small 2=Medium 3=Large Please enter your selection: 2 Please insert 50 cents. Thank you for your business. Descrio do cdigo No Exemplo anterior, se utilizou uma varivel do tipo integral, n, para os casos da instruo switch. Observe que tambm pode utilizar a varivel de srie, s, diretamente. Nesse caso, a estrutura switch pode apresentar a seguinte forma: switch(s) { case "1": ... case "2": ... } Mas no se admite passar explcitamente de uma etiqueta de caso a outra, se est permitido apilhar etiquetas de caso, por exemplo: case 0: case 1: // do something;
Palavra-chave foat
A palavra-chave foat denota um tipo simple que armazena valores de ponto flutuante de 32 bits. A seguinte taba mostra a precisin e ou intervalo aproximado para o tipo foat. Tipo foat Literais De forma predeterminada, um literal numrico real no lado direito do operador dassinalao se trata como double. Por consiguiente, para inicializar uma varivel do tipo foat, utilize ou sufijo f ou F; por exemplo: foat x = 3.5F; Se no utiliza ou sufijo na declarao anterior, obter um erro de compilao, j que est intentando armazenar um valor do tipo double em uma varivel do tipo foat. Converses possvel combinar tipos numricos integral e tipos de ponto flutuante em uma expresso. Neste caso, os tipos integrais se conviertem em tipos de ponto fotante. A evaluao da expresso se realiza segundo as seguintes reglas:
Se uno de os tipos de ponto flutuante double, a expresso se avalie como double (o bool no caso de expresses relacionales ou booleanas).
Precisin 7 dgitos
Se no existe nenhum tipo double na expresso, esta se avalie como foat (o bool no caso de expresses relacionales ou booleanas). Uma expresso de ponto flutuante pode conter os seguintes conjuntos de valores: Cero negativo e positivo
Visual C# Consolidado
218
Infinito positivo e negativo Valor Nam (no um nmero) O conjunto finito de valores distintos de cero
Para obter mais informao sobre estes valores, consulte o estndar IEEE para aritmtica binaria de ponto flutante, disponivel no sitio Web http://www.ieee.org/. Exemplo No seguinte exemplo, se inclui um int, um short e um foat em uma expresso matemtica que proporciona um resultado do tipo foat (observe que no existe nenhum double na expresso). // keyword_foat.cs // Mixing types in expressions using System; class MixedTypes { public static void Main() { int x = 3; foat e = 4.5f; short z = 5; Console.WriteLine("The result is {0}", x*y/z); } }
Resultados
The result is 2.7
Palavra-chave params
A palavra-chave params permite especificar um parmetro de mtodo que aceita um nmero varivel dargumentos. No permitido parmetros adicionales depois da palavra-chave params, nem varias palavraschave params em uma mesma declarao de mtodo. Exemplo // cs_params.cs using System; public class MyClass { public static void UseParams(params int[] list) { for ( int i = 0 ; i < list.Length ; i++ ) Console.WriteLine(list[i]); Console.WriteLine(); } public static void UseParams2(params object[] list) { for ( int i = 0 ; i < list.Length ; i++ ) Console.WriteLine(list[i]); Console.WriteLine(); } public static void Main() {
Visual C# Consolidado
219
UseParams(1, 2, 3); UseParams2(1, 'a', "test"); int[] myarray = new int[3] {10,11,12}; UseParams(myarray); } }
Resultado
1 2 3 1 a test 10 11 12
Palavra-chave typeof
O operador typeof utilizado com o fim de obter ou objeto System.Type para um tipo. uma expresso typeof se apresenta da seguinte forma: t y p e o f ( type) de onde: type Tipo cujo objeto System.Type se deseja obtener. Comentarios O operador typeof no pode sobrecargar. Para obter ou tipo de uma expresso em tiempo de execuo, pode utilizar o mtodo GetType do .NET Framework. Exemplo // cs_operator_typeof.cs // Using typeof operator using System; using System.Reflection; public class MyClass { public int intI; public void MyMeth() { } public static void Main() {
Visual C# Consolidado
220
Type t = typeof(MyClass); // alternatively, you could use // MyClass t1 = new MyClass(); // Type t = t1.GetType(); MethodInfo[] x = t.GetMethods(); foreach (MethodInfo xtemp in x) { Console.WriteLine(xtemp.ToString()); } Console.WriteLine(); MemberInfo[] x2 = t.GetMembers(); foreach (MemberInfo xtemp2 in x2) { Console.WriteLine(xtemp2.ToString()); } } }
Resultado
Int32 GetHashCode() Boolean Equals(System.Object) System.String ToString() Void MyMeth() Void Main() System.Type GetType() Int32 intI Int32 GetHashCode() Boolean Equals(System.Object) System.String ToString() Void MyMeth() Void Main() System.Type GetType() Void .ctor() Exemplo // cs_operator_typeof2.cs // Using GetType method using System; class GetTypeTest { public static void Main() { int radius = 3; Console.WriteLine("Area = {0}", radius*radius*Math.PI); Console.WriteLine("The type is {0}",
Visual C# Consolidado
221
(radius*radius*Math.PI).GetType()); } }
Resultado
Area = 28.2743338823081 The type is System.Double
Palavra-chave try-catch
A instruo try-catch consta de um bloco try seguido de uma ou mais clusulas catch, as quais especificam controladores para diferentes excees . Esta instruo apresenta uma das seguintes formas: t r y try-bock c a t c h ( exception-declaration-1) catch-bock-1 c a t c h ( exception-declaration-2) catch-bock-2 ... t r y try-bock c a t c h catch-bock de onde: try-bock Contm o segmento de cdigo que pode produzir a exceo. Declarao do objeto exceo. Contm o controlador da exceo. exception-declaration, exception-declaration-1, exception-declaration-2 catch-bock, catch-bock-1, catch-bock-2 Comentarios O bloco try-bock Contm o bloco de cdigo suceptvel de causar a exceo. Este bloco se executa at que se produza uma exceo ou at completarse satisfatoriamente. Por exemplo, ou seguinte intento de converter o tipo de um objeto null provoca a exceo NullReferenceException: object o2 = null; try { int i2 = (int) o2; // Erro } A clusula catch pode utilizar sem argumentos, em cujo caso captura qualquer tipo de exceo e se conhece como clusula catch geral. Tambm pode aceitar um argumento de objeto derivado de System.Exception, em cujo caso trata uma exceo especfica. Por exemplo: catch (InvalidCastException e) { } possvel utilizar mais de uma clusula catch especfica na mesma instruo try-catch. Neste caso, a ordem das clusulas catch importante j que estas se examinam por ordem. As excees mais especficas se capturam antes que as menos especficas.
Visual C# Consolidado
222
Se pode utilizar uma instruo throw no bloco catch para voltar a provocar a exceo capturada pela instruo catch. Por exemplo: catch (InvalidCastException e) { throw (e); // Rethrowing exception e } Se deseja voltar a provocar a exceo que est sendo atualmente controlada por uma clusula catch sem parmetros, use a instruo throw sem argumentos. Por exemplo: catch { throw; } Quando estes dentro de um bloco try, inicialice s variveis declaradas em seu interior; caso contrario, pode provocarse uma exceo antes de que se complete a execuo do boque. Por exemplo, no seguinte Exemplo de cdigo, a varivel x se inicializa dentro do bloco try. Ao intentar utilizar a varivel fora do bloco try, na instruo Write(x), se gerar ou seguinte erro do compilador: Uso de varivel ocal no assinalada. public static void Main() { int x; try { x = 123; // Don't do that. // ... } catch { // ... } Console.Write(x); // Erro: Use of unassigned ocal varivel 'x'. } Exemplo Neste exemplo, o bloco try contm uma chamada ao mtodo MyFn(), que pode produzir uma exceo. A clusula catch Contm o controlador da exceo, o qual simplemente mostra um mensagem na tela. Quando se realiza a chamada instruo throw desde dentro de MyFn(), o sistema busca a instruo catch e mostra a mensagem Exception caught. // Rethrowing exceptions: using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } catch (Exception e)
Visual C# Consolidado
223
{ Console.WriteLine("{0} Exception caught.", e); } } public void MyFn(string s) { if (s == null) throw(new ArgumentNullException()); } }
Resultado
Se produza a exceo seguinte: System.ArgumentNullException Exemplo Neste exemplo, se utilizam dos instrues catch. A exceo mais especfica, que aparece em primeiro lugar, se captura primero. // Ordering catch clauses using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } // Most specific: catch (ArgumentNullException e) { Console.WriteLine("{0} First exception caught.", e); } // Least specific: catch (Exception e) { Console.WriteLine("{0} Second exception caught.", e); } } public void MyFn(string s) { if (s == null) throw new ArgumentNullException(); } }
Resultado
Se produza a exceo seguinte:
Visual C# Consolidado
224
System.ArgumentNullException No Exemplo anterior, se empieza com a clusula catch menos especfica, se obter o mensagem: A previous catch clause already catches all exceptions of this or a super type ('System.Exception') No obstante, para capturar a exceo menos especfica, deve substituir a instruo throw pela seguinte: throw new Exception();
Palavra-chave for
O lao for executa uma instruo ou um bloco de instrues repetidamente at que uma expresso especificada se avalie como false. Apresenta a seguinte forma: f o r ( [initializers]; [expression]; [iterators]) statement de onde: initializers Lista de expresses ou instrues dassinalao, separadas por comas, que inicializam os contadores do lao. expression Expresso que pode converterse implcitamente no tipo bool ou em um tipo que contenga a sobrecarga de os operadores true e false. A expresso se usa para comprovar ou criterio de terminao do lao. iterators Expresses ou instrues que incrementan ou reducem os contadores do lao. Instrues que se devem executar dentro do lao. statement Comentarios A instruo for executa sus instrues internas repetidamente da seguinte forma:
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
Resultado
1 2 3 4 5
Palavra-chave private
A palavra-chave private um modificador de acesso de membros. ou acesso do tipo private corresponde ao nivo de acesso mais restrictivo. Os membros privados s so accesibles dentro do corpo da classe o a estrutura na qual se declaran. Os tipos anidados do mesmo corpo tambm podem ter acesso a esses membros privados. Fazer referencia a um membro privado fora da classe o estrutura na que se declara produza um erro de compilao. Encontrar uma comparao de private com os outros modificadores de acesso em Niveles daccesibilidad. Exemplo Neste exemplo, a classe Empoyee contm um membro pblico, Name, e um membro privado, Salary. ou acesso ao membro pblico pode realizar diretamente, enquanto que o acesso ao membro privado deve fazerse a travs do mtodo pblico AccessSalary(). // private_keyword.cs using System; class Empoyee { public string name = "xx"; double salary = 100.00; // private access by default public double AccessSalary() { return salary; } } class MainClass { public static void Main() { Empoyee e = new Empoyee(); // Accessing the public field: string n = e.name; // Accessing the private field: double s = e.AccessSalary(); }
Visual C# Consolidado
226
} No Exemplo anterior, se intenta obter acesso diretamente a os membros privados mediante uma instruo como a seguinte: double s = e.salary; obter o seguinte mensagem de erro: 'Empoyee.Salary' is inaccessible due to its protection level.
Palavra-chave uint
A palavra-chave uint denota um tipo integral que armazena valores segundo ou tamanho e ou intervo que se indicam na taba seguinte. Tipo uint Literais As variveis do tipo uint podem se declarar e inicializar como no seguinte exemplo: uint myUint = 4294967290; Quando um literal inteiro no tem sufijo, seu tipo ou primero de estes tipos no que pode representar seu valor: int, uint, ong, uong. Neste exemplo, uint. Tambm pode utilizar o sufijo u ou U: uint myUint = 123U; Quando utilizado ou sufijo U ou u, ou tipo do literal ser uint ou uong, segundo seu tamanho. Neste exemplo, uint. Converses Existe uma converso implcita predefinida de uint a ong, uong, foat, double ou decimal. Por exemplo: foat myFoat = 4294967290; // OK: implicit conversion to foat Existe uma converso implcita predefinida de byte, ushort ou char a uint. Em qualquer outro caso, deve utilizar uma converso explcita. Por exemplo, para uma varivel do tipo ong, myOng, a seguinte instruo dassinalao produzir um erro de compilao sem uma converso explcita: ong myOng = 22; uint myUint = myOng; // Erro: no implicit conversion from ong uint myUint = (uint)myOng; // OK: explicit conversion Observe que tampoco existe converso implcita de tipos de ponto flutuante a uint. Por exemplo, a instruo seguinte gerar um erro de compilao, a menos que se utilize uma converso explcita: uint x = 3.0; // Erro: no implicit conversion from double uint e = (uint)3.0; // OK: explicit conversion Para obter mais informao sobre expresses aritmticas com tipos de ponto flutuante e tipos integrais, veja foat e double. Para obter mais informao sobre as regas de converso numrica implcitas, veja a Taba de converses numricas implcitas. Intervalo 0 a 4.294.967.295 Tamanho Inteiro de 32 bits sem signo Tipo do .NET Framework System.UInt32
Visual C# Consolidado
227
PALAVRA-CHAVE CHAR
A palavra-chave char utilizado para declarar um carcter Unicode no intervalo indicado na seguinte tabla. Os caracteres Unicode so caracteres de 16 bits que se utilizam para representar a maiora de os lenguajes escritos de todo ou mundo. Tipo do .NET Framework System.Char
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
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:
Palavra-chave volatile
A palavra-chave volatile indica que um campo pode ser modificado no programa pelo sistema operativo, ou hardware ou um subproceso em execuo de forma simultnea. v o l a t i l e declaration de onde: declaration A declarao de um campo. Comentarios O sistema siempre lee o valor atual de um objeto voltil no ponto de onde se solicita, aum quando a instruo previa pidiera um valor ao mesmo objeto. Assim mesmo, o valor de um objeto se escreve inmediatamente no momento da assinalao. O modificador volatile se suele utilizar para um campo ao que tengan acesso varios subprocesses sem utilizar a instruo ock para serializar ou acesso . O uso do modificador volatile garante que um subproceso recupere o valor mais atualizado de os escritos por outro subproceso. O tipo de um campo marcado como voltil est restringido a os seguintes tipos: Qualquer tipo de referencia. Qualquer tipo de ponteiro (em um contexto no seguro). Os tipos byte, sbyte, short, ushort, int, uint, char, foat ou bool. Um tipo enum com um tipo base enum de byte, sbyte, short, ushort, int ou uint.
Para obter mais informao sobre o modificador volatile, veja 10.4.3 Campos voltiles. Exemplo O Exemplo seguinte mostra como declarar uma varivel de campo pblica como volatile. // csharp_volatile.cs class Test { public volatile int i; Test(int _i) { i = _i; } public static void Main() {
Visual C# Consolidado
229
} }
Palavra-chave delegate
Uma declarao delegate define um tipo de referencia que pode utilizar para encapsular um mtodo com uma firma especfica. uma instancia de delegado encapsua um mtodo esttico ou de instancia. Os delegados so similares a os ponteiros a funes de C++, pois so mais seguros e proporcionam maior seguridad de tipos. A declarao apresenta a seguinte forma: [attributes] [modifiers] d e l e g a t e result-type identifier ( [formal-parameters]) ; de onde: attributes (opcional) Informao declarativa adicional. Para obter mais informao sobre os atributos e as classes datributo, veja 17. Atributos. modifiers (opcional) Os modificadores permitidos so new e os cuatro modificadores de acesso . result-type Tipo do resultado, que coincide com o tipo devuelto do mtodo. Mome do delegado. identifier formal-parameters (opcional) Lista de parmetros. Se um parmetro um ponteiro, ou delegado deve declararse com o modificador unsafe. Comentarios Um delegado permite passar uma funo como parmetro. A seguridad de tipos de os delegados requiere que a funo que se pasa como delegado tenga a mesma firma que a declarao do delegado. Veja ou Tutorial de delegados para obter mais informao sobre o uso de delegados. O Tutorial de delegados mostra como componer delegados, assim, criar delegados a partir de outros delegados. um delegado que contm um parmetro out no pode componer. Os delegados so a base de os eventos. Para obter mais informao sobre delegados, veja 15. Delegados. Exemplo 1 O seguinte um Exemplo sencilo de declarao e uso de um delegado. // keyword_delegate.cs // delegate declaration delegate void MyDelegate(int i); class Program { public static void Main() { TakesADelegate(new MyDelegate(DelegateFunction)); } public static void TakesADelegate(MyDelegate SomeFunction) {
Visual C# Consolidado
230
SomeFunction(21); } public static void DelegateFunction(int i) { System.Console.WriteLine("Called by delegate with number: {0}.", i); } }
Resultados
Called by delegate with number: 21. Exemplo 2 no seguinte exemplo, um delegado se assinala os mtodos estticos e de instancia e devolve informao especfica de cada uno de elos. // keyword_delegate2.cs // Calling both static and instance methods from delegates using System; // delegate declaration delegate void MyDelegate(); public class MyClass { public void InstanceMethod() { Console.WriteLine("A message from the instance method."); } static public void StaticMethod() { Console.WriteLine("A message from the static method."); } } public class MainClass { static public void Main() { MyClass p = new MyClass(); // Map the delegate to the instance method: MyDelegate d = new MyDelegate(p.InstanceMethod); d(); // Map to the static method: d = new MyDelegate(MyClass.StaticMethod); d(); } }
Resultados
A message from the instance method. A message from the static method.
Visual C# Consolidado
231
Palavra-chave ock
A palavra-chave ock marca um bloco de instrues como uma seo crucial, para o que utiliza ou boqueo de exclusin mutua de um objeto, a execuo de uma instruo y, posteriormente, a liberao do boqueo. A instruo apresenta a seguinte forma: o c k ( expression) statement_bock de onde: expression Especifica ou objeto sobre ou que se deseja aplicar a instruo ock. Expression deve ser um tipo de referencia. Normalmente, expression ser this, se se deseja proteger uma varivel de instancia, ou biem typeof(classe), se se deseja proteger uma varivel do tipo static (o se a seo crtica se encontra em um mtodo esttico da classe dada). statement_bock Instrues da seo crtica. Comentarios A instruo ock permite garantizar que um subproceso no va a entrar em uma seo crtica de cdigo enquanto outro subproceso j se encontra em ella. Se outro subproceso intenta entrar em um cdigo boqueado, esperar at que o objeto se libere. Exemplo 1 O seguinte Exemplo mostra um uso simple de subprocesses em C#. // statements_ock.cs using System; using System.Threading; class ThreadTest { public void runme() { Console.WriteLine("runme called"); } public static void Main() { ThreadTest b = new ThreadTest(); Thread t = new Thread(new ThreadStart(b.runme)); t.Start(); } }
Resultado
runme called Exemplo 2 O seguinte Exemplo usa subprocesses e ock. Enquanto a instruo ock est presente, o bloco de instrues constituye uma seo crtica e balance nunca se converter em um nmero negativo. // statements_ock2.cs using System;
Visual C# Consolidado
232
using System.Threading; class Account { int balance; Random r = new Random(); public Account(int initial) { balance = initial; } int Withdraw(int amount) { // This condition will never be true unless the ock statement // is commented out: if (balance < 0) { throw new Exception("Negative Balance"); } // Comment out the next line to see the effect of leaving out // the ock keyword: ock (this) { if (balance >= amount) { Console.WriteLine("Balance before Withdrawal :" +balance); Console.WriteLine("Amount to Withdraw :-"+ amount); balance = balance - amount; Console.WriteLine("Balance after Withdrawal : " + balance); return amount; } else { return 0; // transaction rejected } } } public void DoTransactions() { for (int i = 0; i < 100; i++) { Withdraw(r.Next(1, 100)); } } } class Test { public static void Main() { Thread[] threads = new Thread[10]; Account acc = new Account (1000); for (int i = 0; i < 10; i++) { Thread t = new Thread(new ThreadStart(acc.DoTransactions));
Visual C# Consolidado
233
Palavra-chave stackaloc
Permite assinalar um bloco de memoria na pilba. type * ptr = s t a c k a l o c type [ expr ] ; de onde: type ptr expr Expresso entera. Comentarios Se reserva na pia um bloco de memoria de tamanho suficiente para conter expr elementos do tipo type; a direo do bloco se armazena no ponteiro ptr. Esta memoria no est sometida a reciclaje y, por o tanto, no necessita fijarse (por medio de fixed). A vida do bloco de memoria se limita vida do mtodo no que se define. O operador stackaloc s vlido em inicializadores de variveis ocales. Como se utilizam ponteiros (ver A.2 Tipos de ponteiro), stackaloc requiere um contexto unsafe. O operador stackaloc similar a _aloca da biblioteca de tiempo de execuo de C. Exemplo // cs_keyword_stackaloc.cs // compile with: /unsafe using System; class Test { public static unsafe void Main() { int* fib = stackaloc int[100]; int* p = fib; *p++ = *p++ = 1; for (int i=2; i<100; ++i, ++p) *p = p[-1] + p[-2]; for (int i=0; i<10; ++i) Console.WriteLine (fib[i]); } } Mome de ponteiro. Tipo no administrado.
Resultado
1
Visual C# Consolidado
234
1 2 3 5 8 13 21 34 55
Visual C# Consolidado
235
Visual C# Consolidado
236
OPERADORES C#
C# fornece um conjunto grande de operadores, que so smbolos que especificam as operaes para executar em uma expresso. C# predefines os operadores aritmticos e lgicos normal, bem como uma variedade de outras pessoas como mostrado na tabela a seguir. Operaes em integral tipos, como ==, !=, <, >, <=, >=, binary +, binary -, ^, &, |, ~, ++, --,. e sizeof() geralmente so permitidos em enumeraes Alm disso, vrios operadores podem ser Sobrecarregado pelo usurio, assim alterando seu significado quando aplicado a um tipo definido pelo usurio. Categoria de operadores Aritmtica Lgico (boolean e bit a bit) Concatenao de seqncia de caracteres Incremento, decrement SHIFT Relacional Atribuio Acesso membro Indexao Converso Condicional Concatenao representante e remoo A criao do objeto Informaes de Tipo Estouro Controle de exceo Indirection e endereo Estouro Aritmtico Os operadores aritmticos (+., -) pode produzir resultados que estejam fora do intervalo dos valores possveis para o tipo numrico envolvido, /* Voc deve consultar a seo sobre um operador especfico para obter detalhes, mas em geral:
Operadores + - * / % & | ^ ! ~ && || True False + ++ -<< >> == != < > <= >= = += -= *= /= %= &= |= ^= <<= >>= ?? . [] () ?: + Novo Como sizeof TypeOf Marcada desmarcada * -> [] &
Qualquer throws estouro aritmtico inteiro ou descarta os bits do resultado mais significativos. um OverflowException Diviso por zero sempre throws um DivideByZeroException. Ponto flutuante estouro aritmtico ou diviso por zero nunca gera uma exceo, como tipos de ponto flutuante esto baseados em IEEE 754 and caso tenha disposies para representar infinito e NaN (Not a Number). Estouro Aritmtico Decimal Sempre gera um OverflowException. Decimal diviso por zero sempre throws um DivideByZeroException. Quando estouro inteiro ocorre, o que acontece depende do contexto de execuo, que pode ser marcado ou desmarcado. Em um contexto selecionado, ser gerada. um OverflowException Em um contexto desmarcado, os bits do resultado mais significativos so descartados e continua a execuo. Assim, C# oferece a voc a opo de manipulao ou ignorando estouro.
Visual C# Consolidado
237
Os operadores aritmticos, alm de tipo integral-tipo para integral-casts podem causar estouro, por exemplo, Projetando e esto sujeitas s execuo marcado ou desmarcado. para um Longo An Int, Entretanto, operadores bit a bit e operadores SHIFT nunca causar estouro.
Transbordamento aritmtico
Os operadores aritmticos (+, -, *, /) podem produzir resultados fora do intervalo de valores possveis para o tipo numrico implicado. Pode encontrar mais informao acerca de um determinado operador na seo Referena do lenguaje C#; no obstante, em general:
O transbordamento aritmtico de inteiros inicia uma exceo de transbordamento (OverflowExcetion) o bem elimina os bits mais significativos do resultado (vase mais abaixo). a diviso de inteiros por cero sempre produz uma exceo DivideByZeroExcetion. O transbordamento aritmtico ou a diviso por cero em ponto flutuante no produzem uma exceo, j que os tipos de ponto flutuante se baseiam em o estndar IEEE 754, que proporciona uma representao para os valores infinito e Nam (Not a Number, no um nmero). O transbordamento aritmtico de valores do tipo decimal sempre produz uma exceo
OverflowExcetion. a diviso de valores decimal por zero sempre produz uma exceo DivideByZeroExcetion. Quando produzido um transbordamento de inteiros, lo que ocurre depende do contexto da execuo, o qual pode ser checkede o unchecked. em um contexto checkede (comprobado), produzido uma exceo OverflowExcetion. em um contexto uncheckede (no comprobado), os bits mais significativos do resultado no se temm em cuenta e a execuo contina. Desta forma, C# permite escolher entre atender o desatender o transbordamento. Alm dos operadores aritmticos, as converses explcitas entre tipos integrais tambm podem produzir transbordamento (por exemplo, converter um tipo long em um tipo int) e esto sometidas ao tipo de execuo checkede o unchecked. Por otro lado, observe que os operadores de deslocamento e de bit a bit nunca produzem transbordamento.
Operadores sobrecarregados
C# permite sobrecarregar operadores nos tipos definidos pelo usuario, mediante a definio, com a palavra chave operator, de funes membro estticas. No obstante, no todos os operadores podem ser sobrecarregados, e alguns apresentam restrices, como se indica na seguinte tabela: Operadores +, -, !, ~, ++, --, true, false +, -, *, /, %, &, |, ^, <<, >> Posibilidade de sobrecarrega Estes operadores unrios podem ser sobrecarregados. Estes operadores binrios podem ser sobrecarregados.
Visual C# Consolidado
238
Os operadores de comparao podem ser sobrecarregados (veja a nota mais abaixo). Os operadores lgicos no podem ser cargar, mas se avaliam com & e |, que podem sobrecarregarse. Veja 7.11.2 Operadores lgicos condicionais definidos pelo usuario. O operador de indicao de arrays no pode sobrecarregar, mas podem ser definido indicadores. O operador de converso explcita do tipos no pode sobrecarregar, mas podem ser definido novos operadores de converso (veja explicit e implicit). Os operadores de assinalao no podem ser sobrecarregados, mas +=, por exemplo, se avalia com +, o qual se pode sobrecarregar. Estes operadores no podem ser sobrecarregados.
[] ()
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= =, ., ?:, ->, new, is, sizeof, typeof
Nota os operadores de comparao, se sobrecarregam, devem ser por parejas; dizer, se sobrecarrega ==, tambm deve sobrecarregar !=. Tambm cierta a opo contraria, anlogamente para o caso de < e >, e para <= e >=.
Operador [ ]
Os colchetes ([ ]) so utilizados para arrays, indicadores e atributos. Tambm podem ser utilizar com ponteiros. type [ ] array [ indexexpr ] De onde: type Tipo. array Array. indexexpr Expresso de ndice. Comentarios Um tipo de array composto de um tipo seguido de []: int[] fib; // fib is of type int[], "array of int" fib = new int[100]; // criate a 100-element int array Para obter acesso a um elemento do array, o ndice do elemento desejado se encierra entre colchetes: fib[0] = fib[1] = 1; for( int i=2; i<100; ++i ) fib[i] = fib[i-1] + fib[i-2]; produzido uma exceo se o ndice do array est fora do intervalo declarado. O operador de indicao no pode sobrecarregar; no obstante, os tipos podem definir indicadores, que so propriedades que aceitam um ou varios parmetros. Os parmetros de um
Visual C# Consolidado
239
indicador ficam entre colchetes, como os ndices de um array, mas podem ser declarar de qualquer tipo (a diferena dos ndices de um array, que somente podem ser integrais). Por exemplo, .NET Framework define um tipo Hashtable que asoa chaves e valores do tipo arbitrario: Collections.Hashtable h = new Collections.Hashtable(); h["a"] = 123; // note: using a string as the index Os colchetes tambm so utilizados para especificar atributos: [attribute(AllowMultiple=true)] public class Attr { } Podem ser utilizados colchetes para obter o valor que aponta um ponteiro segundo um ndice (veja A.2 Tipos de ponteiros): unsafe fixede ( int* p = fib ) // p points to fib from earlier example { p[0] = p[1] = 1; for( int i=2; i<100; ++i ) p[i] = p[i-1] + p[i-2]; } No obstante, tenga em cuenta que no se realiza uma comprobao dos lmites do ndice.
Operador ( )
Alm disso de seu uso para especificar o ordem de as operaes em uma expresso, os parntesis so utilizados para especificar converses do tipo explcitas (cast): ( type ) expr De onde: type Nome do tipo o que se deseja converter a expresso expr. expr Expresso. Comentarios Uma converso do tipo invoca explcitamente ao operador de converso para converter o tipo da expresso expr ao tipo type; ser produzido um erro na converso se no se tenha definido esse operador. Para definir um operador de converso, veja explicit e implicit. Exemplo O seguinte programa converte explcitamente um tipo double em um tipo int. O programa no compilar sem o operador de converso do tipo. // cs_operator_parentheses.cs using System; class Test { public static void Main() { double x = 1234.7; int a; a = (int)x; // cast double to int Console.WriteLine(a);
Visual C# Consolidado
240
} }
Resultado
1234
Operador . (ponto)
O operador de ponto utilizado para o acesso a membros. name1 . name2 De onde: name1 Nome. name2 Nome. Comentarios Por exemplo, considere a seguinte clase: class Simple { public int a; public void b() { } } Simple s = new Simple(); A variveis tem dos membros, a e b; para tener acesso a ellos, use o operador de ponto: s.a = 6; // assign to field a; s.b(); // invoke member function b; O ponto tambm utilizado para formar nomes completos, dizer, nomes que especificam o namespaces ou a interfaz (por exemplo) que pertencem. System.Console.WriteLine("hello"); // class Console in namespace System A directiva using hace que a calificao de nomes seja opcional em alguns casos: using System; ... System.Console.WriteLine("hello"); Console.WriteLine("hello"); // same thing Mas, um identificador ambiguo deve calificarse: using System; using OtherSystem; // a namespace containing another Console class ... System.Console.WriteLine( "hello" ); // must qualify Console
Operador +
O operador + pode funcionar como operador unrio o binrio.
Visual C# Consolidado
241
+ expr expr1 + expr2 De onde: expr Expresso. expr1 Expresso. expr2 Expresso. Comentarios Os operadores + unrios se encontram predefinidos para todos os tipos numricos. O resultado de uma operao + unaria aplicada a um tipo numrico simplemente o valor do operando. Os operadores + binrios esto predefinidos para os tipos numricos e de cadena de caracteres. Para tipos numricos, + calcula a suma de seus dos operandos. Quando ao menos um dos operandos do tipo string, + concatena as representaes do tipo string dos operandos. Os tipos delegados tambm proporcionam um operador binrio +, o qual realiza a concatenao de delegados. Os tipos definidos pelo usuario podem sobrecarregar os operadores + unrio e binrio (veja operator). Exemplo // cs_operator_plus.cs using System; class Test { public static void Main() { Console.WriteLine(+5); // unary plus Console.WriteLine(5 + 5); // addition Console.WriteLine(5 + .5); // addition Console.WriteLine("5" + "5"); // string concatenation Console.WriteLine(5.0 + "5"); // string concatenation // note automatic conversion from double to string } }
Resultado
5 10 5.5 55 55
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
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
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.
Visual C# Consolidado
256
Um smbolo que voc define com /define ou com #define no entrar em conflito com uma varivel com o mesmo nome. Isto , um nome de varivel no deve ser passado para uma Diretiva de pr-processamento e um smbolo s pode ser avaliado por uma diretiva de prprocessamento. O escopo de um smbolo criado com #define o arquivo no qual ele foi definido. Exemplo // preprocessor_if.cs #define DEBUG #define VC_V7 using System; public class MyClass { static void Main() { #if (DEBUG && !VC_V7) Console.WriteLine("DEBUG is defined"); #elif (!DEBUG && VC_V7) Console.WriteLine("VC_V7 is defined"); #elif (DEBUG && VC_V7) Console.WriteLine("DEBUG and VC_V7 are defined"); #else Console.WriteLine("DEBUG and VC_V7 are not defined"); #endif } } Sada DEBUG and VC_V7 are defined
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.
Visual C# Consolidado
258
Exemplo // preprocessor_warning.cs // CS1030 expected #define DEBUG class MainClass { static void Main() { #if DEBUG #warning DEBUG is defined #endif } }
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."); } }
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() { } }
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.
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.
Vcvars32.bat Generates fora da mensagem de ambiente Q248802: Se a verso atual do Visual Studio estiver instalada em um computador que tambm possui uma verso anterior do Visual Studio, voc no deve executar vsvars32.bat ou vcvars32.bat de verses diferentes na mesma janela de comando. Para executar VSVARS32.BAT 1. 2. No prompt de comando, mude para a subpasta Common7\Tools da instalao. Executar VSVARS32.bat digitando VSVARS32.
Cuidado VSVARS32.bat pode variar de mquina para mquina. No substituir um arquivo VSVARS32.bat ausente ou danificado com um VSVARS32.bat do outro computador. Execute novamente a instalao para substituir o arquivo ausente.
Visual C# Consolidado
263
IMPLANTAO DE APLICATIVOS C#
Aps a concluso criar seu aplicativo C#, a prxima etapa para distribu-lo. C# uma linguagem .NET; portanto, distribuir qualquer executveis C# para outras mquinas requer o .NET Framework para ser instalado em cada mquina de execuo (e possivelmente outras dependncias especficas para seu aplicativo). Voc tem uma variedade de opes disponveis para distribuir o .NET Framework. Para obter uma viso geral, consulte Redistribuindo o .NET Framework. Mover concludos aplicativos para outros computadores chamado geralmente de implantao. Ambiente de desenvolvimento da Microsoft fornece mecanismos para implantao; para obter mais informaes, consulte Implantando aplicativos e componentes. Se voc criar e distribuir principalmente na linha de comando, voc talvez precise considerar outros mtodos de implantao e redistribuindo dependncias.
Otimizao
Opo /filealign / Otimizar Propsito Especifica o tamanho das sees no arquivo de sada. Ativa / desativa otimizaes.
Arquivos de sada
Opo /Doc / Fora /PDB /target Propsito Especifica um arquivo XML onde os comentrios documentao processados so a serem gravados. Especifica o arquivo de sada. Especifica o nome de arquivo e local do arquivo.pdb. Especifica o formato do arquivo de sada usando uma das quatro opes: /Target:exe/Target:Library/Target:Module/Target:winexe
Visual C# Consolidado
264
/nostdlib /Reference
Instrui o compilador No para importar a biblioteca padro (mscorlib.dll). Importa metadados de um arquivo que contm um conjunto.
Preprocessor
Opo / Define Propsito Define smbolos de pr-processamento.
Recursos
Opo /linkresource /Resource /win32icon /win32res Propsito Cria um vnculo a um recurso gerenciado. Incorpora um recurso do .NET Framework no arquivo de sada. Especifica um arquivo.ico para inserir no arquivo de sada. Especifica um recurso do Win32 para inserir no arquivo de sada.
Diversos
Opo @ /? /Codepage /help /langversion / Principal /noconfig /nologo Evita /recurse Propsito Especifica um arquivo de resposta. Lista opes do compilador para STDOUT. Especifica a pgina de cdigos a ser usado para todos os arquivos de cdigo de fonte a compilao. Lista opes do compilador para STDOUT. Especifica qual verso do idioma a ser usado. Especifica o local do mtodo Main. Instrui o compilador no para compilar com CSC.RSP. Suprime as informaes de faixa do compilador. Procura subdiretrios para arquivos de origem para compilar.
Visual C# Consolidado
265
/ unsafe /utf8output
Permite compilao do cdigo que usa a No seguro palavra-chave. Exibe compilador sada usando a codificao UTF-8.
/ selecionada Faz o compilador para gerar verificaes de estouro. /Codepage /Debug / Define /delaysign /Doc /errorreport /filealign /fullpaths /help
/incremental Permite compilao incremental [obsoleta]. /keycontainer Especifica um recipiente de chave de nome de alta segurana. /KeyFile /langversion /lib /linkresource / Principal /noconfig /nologo Evita Especifica um arquivo de chave de nome de alta segurana. Especifica modos de verso de idioma: ISO-1 ou padro. Especificar diretrios adicionais para procurar por referncias em. Vincula o recurso especificado a este conjunto. Especifica o tipo que contm o ponto de entrada (Ignorar todos os outros pontos de entrada possveis). Instrui o compilador no para automaticamente incluir arquivo CSC.RSP. Suprime mensagem de direitos autorais do compilador.
Visual C# Consolidado
266
/nostdlib /nowarn / Otimizar / Fora /PDB /platform /recurse /Reference /Resource /target / unsafe /utf8output / Avisar /warnaserror /win32icon /win32res
Instrui o compilador no referncia biblioteca padro (mscorlib.dll). Desativa especfico mensagens de aviso Ativa / desativa otimizaes. Especifica o nome do arquivo de sada (padro:). base Nome do arquivo com classe principal ou primeiro arquivo Especifica o nome de arquivo e local do arquivo.pdb. Limites que plataformas esse cdigo pode executado em: x 86, Itanium, x 64, ou anycpu. O padro anycpu. Inclui todos os arquivos no diretrio atual e subdiretrios de acordo com as especificaes curinga. Metadados referncias a partir dos arquivos conjunto especificado. Incorpora o recurso especificado. Especifica o formato do arquivo de sada usando uma das quatro opes: /Target:exe/Target:Library/Target:Module/Target:winexe Permite que No seguro o cdigo. Sadas Mensagens do compilador em codificao UTF-8. Define o nvel de aviso (0-4). Relatrios especficos avisos como erros. Usa este cone para a sada. Especifica o arquivo de recurso do Win32 (. res).
Clique no nmero de erro no e pressione F1. o Janela Output, OuDigite o nmero do erro na caixa Look for no ndice. OuDigite o nmero de erro na pgina Search.
Visual C# Consolidado
267
EXEMPLOS DO VISUAL C#
Voc pode acessar cdigo de exemplo, procurando resumos de Exemplo nesta seo. Cada abstrato contm um link para abrir ou copiar o Exemplo na arquivos. Alm disso, o SDK do .NET Framework inclui tecnologia e aplicativo Exemplos e tutoriais QuickStart que demonstram recursos .NET Framework e cdigo Visual C#. Os tutoriais QuickStart so a maneira mais rpida para entender o que a tecnologia .NET Framework oferece desenvolvedores lder-borda. Os QuickStarts so uma srie de exemplos e suporte documentao projetadas para rapidamente acquaint voc com a sintaxe, arquitetura, e poder do Visual Studio e o .NET Framework. Do ASP.NET Os tutoriais QuickStart inclui exemplos na e aplicativos Windows Forms, alm de muitos aplicativos instruo que abrangem os recursos da tecnologia .NET Framework mais atraentes. Para acessar o QuickStarts, clique em Start, aponte para Programs, aponte para Microsoft .NET Framework SDK v2.0, e clique em QuickStart Tutorials. Uma pgina da Web do aplicativo " tutoriais QuickStart SDK Microsoft .NET Framework " exibida. Para executar o QuickStarts, siga as instrues na pgina, que configura o banco de dados amostras e conclui a instalao. Para obter mais informaes, consulte Amostras e QuickStarts. Exemplos de introduo Annimo Exemplo representantes Exemplo matrizes Coleo Exemplo classes Exemplo generics (C#) Demonstra o uso de representantes para reduzir a complexidade de aplicativos sem nome. Mostra como usar matrizes. Mostra como fazer classes coleo Generic no-que podem ser usados com a foreach instruo. Mostra como fazer classes a coleo genrica que podem ser usados com a foreach instruo.
Exemplo de parmetros Demonstra simples processamento de linha de comando e matriz da linha de comando indexao. Exemplo dos Mtodos condicional Demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido.
Exemplo representantes Mostra como representantes so declaradas, mapeado, e combinados. Exemplo eventos Exemplo de implementao de interface explcita Exemplo World de saudao Exemplo indexadores Indexado Exemplo propriedades Mostra como usar eventos em C#. Demonstra como explicitamente implementar membros de interface.
Um aplicativo hello world. Mostra como usar notao de matriz para acessar um objeto. Mostra como a implementar uma classe que usa propriedades indexadas. Propriedades indexadas permitem que voc para usar uma classe que representa uma coleo de vrios tipos diferentes de itens semelhantes matriz-. Mostra como propriedades so declaradas e usados; tambm demonstra propriedades abstratas.
Exemplo propriedades
Visual C# Consolidado
268
Exemplo Structs Exemplo Overloading do operador Exemplo Conversions definidas pelo usurio Exemplo de verso Produzir exemplo
Mostra como usar structs em C#. Mostra como definido pelo usurio classes poder sobrecarregar operadores. Mostra como definir converses de e para tipos definidos pelo usurio. Do override demonstra verso em C# atravs do uso de e new palavras-chave. Demonstra a palavra-chave rendimento para filtrar itens em uma coleo.
Exemplos intermedirio e Avanado Exemplo atributos Exemplo parte 1 Interop COM Exemplo parte 2 Interop COM Exemplo bibliotecas Mostra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Mostra como usar C# para interoperar com objetos COM. Mostra como um servidor use um C# com um cliente com C++. Mostra como usar opes do compilador para criar uma DLL de vrios arquivos de origem; alm disso, como usar a biblioteca em outros programas. Demonstra tipos de valores que podem ser definidos como nulo. Demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados.
Exemplo tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios arquivos cdigo fonte-C#. Plataforma Invoke exemplo Exemplo de segurana Segmentao de exemplo Exemplo de cdigo no seguros Exemplo de documentao XML Mostra como chamar exportadas funes DLL do C#. Discute a segurana do .NET Framework e mostra duas maneiras de modificar as permisses de segurana em C#: Usando classes de permisso e atributos de permisso. Demonstra vrias atividades do segmento, como criando e executando um segmento, sincronizando segmentos, interagir entre segmentos, e usando um pool de segmentos. Mostra como usar ponteiros. Mostra como a documentar cdigo usando XML.
Visual C# Consolidado
269
Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir os arquivos de Exemplo no Solution Explorer 1. 2. 3. 4. Clique em Download Sample. A caixa de mensagem Download de arquivo ser exibida. Clique em Open e, na coluna esquerda da pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta os arquivos sero extrados para, ou clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo esteja marcada e clique em Finish.
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz a soluo do projeto no confivel. Clique OK para continuar. Para criar e executar os exemplos hello world no Visual Studio 1. 2. 3. 4. 5. 6. 7. 8. 9. Abra a soluo (HelloWorld.sln). No Solution Explorer, clique com o projeto HelloWorld1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Pressione qualquer tecla para fechar HelloWorld1. No Solution Explorer, clique com o projeto HelloWorld2, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Pressione qualquer tecla para fechar HelloWorld2. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Properties.
10. Abra a Configuration Properties pasta, e clique em Debug. 11. Na Command Line Arguments propriedade, tipo A B C D e clique em OK. 12. No menu Debug, clique em Start Without Debugging. 13. Pressione qualquer tecla para fechar HelloWorld3. 14. No Solution Explorer, clique com o projeto HelloWorld4, e clique em Set as StartUp Project. 15. No menu Debug, clique em Start Without Debugging. 16. Pressione qualquer tecla para fechar HelloWorld4. Para criar e executar os exemplos hello world a partir da linha de comando 1. 2. Use o Change Directory comando para alterar para o diretrio HelloWorld. Digite o seguinte:
Visual C# Consolidado
270
cd HelloWorld1 csc Hello1.cs Hello1 3. 4. 5. Digite o seguinte: cd ..\HelloWorld2 csc Hello2.cs Hello2 Digite o seguinte: cd ..\HelloWorld3 csc Hello3.cs Hello3 A B C D Digite o seguinte: cd ..\HelloWorld4 csc Hello4.cs Hello4 Consulte tambm
Para criar e executar os exemplos parmetros de linha de comando a partir da linha de comando
Visual C# Consolidado
271
1. 2. 3. 4.
Use o Change Directory comando para alterar para o diretrio CmdLine1. Digite o seguinte: csc cmdline1.cs cmdline1 A B C Use o Change Directory comando para alterar para o diretrio CmdLine2. Digite o seguinte: csc cmdline2.cs cmdline2 John Paul Mary
Exemplo matrizes
Download sample Este Exemplo descreve e mostra como matrizes funcionam em C#. Para obter mais informaes, consulte Matrizes (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo matrizes no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc arrays.cs arrays
Exemplo propriedades
Download sample Este Exemplo mostra como propriedades so uma parte integral da C# linguagem de programao. Ele demonstra como propriedades so declaradas e usados. Consulte Propriedades Para obter mais informaes. Observao de segurana
Visual C# Consolidado
272
Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos propriedades no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto pessoa e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para shapetest. Use o Change Directory comando para alterar para o diretrio pessoa. Digite o seguinte: csc person.cs person Use o Change Directory comando para alterar para o diretrio shapetest. Digite o seguinte: csc abstractshape.cs shapes.cs shapetest.cs shapetest
Exemplo bibliotecas
Download sample Este Exemplo mostra como criar e usar uma DLL em C#. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. Clique em Download Sample. A File Download caixa de mensagem ser exibida.
Visual C# Consolidado
273
2.
Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.
3.
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo bibliotecas no Visual Studio 1. 2. 3. 4. 5. 6. No Solution Explorer, clique com o projeto FunctionTest, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto FunctionTest, e clique em Properties. Abra a Configuration Properties pasta e clique em Debug. Na propriedade Command Line Arguments, insira 3 5 10. Clique em OK. No menu Debug, clique em Start Without Debugging. Isso automaticamente criar a biblioteca em funes e executar o programa. Use o Change Directory comando para alterar para o diretrio funes. Digite o seguinte: csc /target:library /out:Functions.dll Factorial.cs DigitCounter.cs 3. 4. Use o Change Directory comando para alterar para o diretrio FunctionTest. Digite o seguinte: copy ..\Functions\Functions.dll . csc /out:FunctionTest.exe /R:Functions.DLL FunctionClient.cs FunctionTest 3 5 10
Exemplo de verso
Download sample Este Exemplo demonstra verso em C# atravs do uso de e new palavras-chave. o override Verso ajuda manter a compatibilidade entre classes base e derivados como eles evoluir. Para obter informaes adicionais, consulte Verso com o substituio e palavras-chave new (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer
Visual C# Consolidado
274
1. 2.
Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.
3.
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo verso no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc versioning.cs versioning
Visual C# Consolidado
275
A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos classes coleo no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto CollectionClasses1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para CollectionClasses2. Use o Change Directory comando para alterar para o diretrio CollectionClasses1. Digite o seguinte: csc tokens.cs tokens Use o Change Directory comando para alterar para o diretrio CollectionClasses2. Digite o seguinte: csc tokens2.cs tokens2
Exemplo Structs
Download sample Este Exemplo apresenta a sintaxe e uso de estruturas. Ele tambm aborda as diferenas importantes entre classes e estruturas. Consulte Objetos, classes e Structs (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Structs no Visual Studio
Visual C# Consolidado
276
1. 2. 3. 1. 2. 3. 4.
No Solution Explorer, clique com o projeto Struct1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Struct2. Use o Change Directory comando para alterar para o diretrio Struct1. Digite o seguinte: csc struct1.cs struct1 Use o Change Directory comando para alterar para o diretrio Struct2. Digite o seguinte: csc struct2.cs struct2
Exemplo indexadores
Download sample Este Exemplo mostra como classes C# podem declarar indexadores para fornecer acesso semelhante matriz-s classes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Indexers no Visual Studio 1. 2. 3. 4. No Solution Explorer, clique com o projeto indexadores, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, insira ..\..\Test.txt. Clique em OK.
Visual C# Consolidado
277
5. 1.
No menu Debug, clique em Start Without Debugging. Para compilar o programa de exemplo, digite o seguinte no prompt de comando: csc indexer.cs
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.
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc indexedproperty.cs indexedproperty
Visual C# Consolidado
278
Para criar e executar os exemplos Conversions pelo usurio a partir da linha de comando
Visual C# Consolidado
279
da lista. O Exemplo tambm mostra como cdigo de cliente cria uma instncia da classe, especificando um argumento Tipo, e como restries sobre o parmetro type ativar operaes adicionais a serem executadas sobre os argumentos Tipo. Para obter um Exemplo de uma classe a coleo genrica que implementa um bloco do iterador, consulte COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Generics no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc generics.cs generics
Comentrios Este Exemplo fornecido para fins de demonstrao e no se destina a ser usado sem modificaes no cdigo de produo. Para cdigo de qualidade de produo, ele recomendvel que voc usar as classes coleo no espao para nome System.Collections.Generic sempre que possvel.
Exemplo Overloading
Download sample
do operador
Este Exemplo demonstra classes definidas pelo usurio como poder sobrecarregar operadores. Consulte Operadores C# Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos
Visual C# Consolidado
280
ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Overloading operador no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto complexo e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Dbbool. Use o Change Directory comando para alterar para o diretrio complexo. Digite o seguinte: csc complex.cs complex Use o Change Directory comando para alterar para o diretrio Dbbool. Digite o seguinte: csc dbbool.cs dbbool
Exemplo representantes
Download sample Este Exemplo demonstra os tipos de representante. Ele mostra como para mapear delegados para estticos e mtodos da instncia, e como combin-las para criar representantes de difuso seletiva. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer
Visual C# Consolidado
281
1. 2.
Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.
3.
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos representantes no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto Delegates1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Delegates2. Use o Change Directory comando para alterar para o diretrio Delegates1. Digite o seguinte: csc bookstore.cs bookstore Use o Change Directory comando para alterar para o diretrio Delegates2. Digite o seguinte: csc compose.cs compose
Exemplo eventos
Download sample Este Exemplo mostra como a declarar, chamar, e configurar eventos em C#. Para obter mais informaes, consulte Eventos (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files.
Visual C# Consolidado
282
O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos eventos no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto Events1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Events2. Use o Change Directory comando para alterar para o diretrio Events1. Digite o seguinte: csc events1.cs events1 Use o Change Directory comando para alterar para o diretrio Events2. Digite o seguinte: csc events2.cs events2
Visual C# Consolidado
283
Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Explicit implementao interface no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto ExplicitInterface1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para ExplicitInterface2. Use o Change Directory comando para alterar para o diretrio ExplicitInterface1. Digite o seguinte: csc explicit1.cs explicit1 Use o Change Directory comando para alterar para o diretrio ExplicitInterface2. Digite o seguinte: csc explicit2.cs explicit2
Para criar e executar os exemplos Explicit implementao interface a partir da linha de comando
Visual C# Consolidado
284
No Solution Explorer, clique com o projeto e clique em Properties. Abra a pasta Propriedades de configurao, e clique em Debug. Defina a Command Line Arguments propriedade para A B C. Na pasta Propriedades de configurao, clique em Build. Modificar a Conditional Compilation Constants propriedade. Por exemplo, adicionar ou excluir Debug. Clique em OK. No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo mtodos condicional a partir da linha de comando Para incluir o mtodo condicional, compilar e execute o programa de exemplo, digitando o seguinte no prompt de comando: csc CondMethod.cs tracetest.cs /d:DEBUG tracetest A B C
Visual C# Consolidado
285
4.
No menu Build, clique em Build. O arquivo de sada XML poder ser no diretrio de depurao. Para gerar a documentao XML de exemplo, digite o seguinte no prompt de comando: csc XMLsample.cs /doc:XMLsample.xml Para ver o XML gerado, emita o seguinte comando: type XMLsample.xml
Visual C# Consolidado
286
4. 5. 6.
Digite o seguinte: csc Marshal.cs Marshal Use o Change Directory comando para alterar para o diretrio PInvoke. Digite o seguinte: csc logfont.cs pinvoke.cs pinvoke
Visual C# Consolidado
287
2. 3. 4. 5. 6.
Clique com o boto direito do mouse QuartzTypeLib e, clique em Remove. Clique com o boto direito do mouse References e, clique em Add Reference. Na guia COM, selecione o componente denominado, " biblioteca Tipo de Controle ActiveMovie ". Clique em Select e, clique em OK. Recrie Interop1.
Observao Adicionando uma referncia para o componente faz a mesma coisa que chamar TLBIMP na linha de comando para criar QuartzTypeLib.dll (como mostrado abaixo). Para criar e executar os exemplos com Interop Parte 1 a partir da linha de comando 1. 2. Use o Change Directory comando para alterar para o diretrio Interop1. Digite o seguinte: tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dll csc /r:QuartzTypeLib.dll interop1.cs interop1 %windir%\clock.avi 3. 4. Use o Change Directory comando para alterar para o diretrio Interop2. Digite o seguinte: csc interop2.cs interop2 %windir%\clock.avi
Visual C# Consolidado
288
Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo 2 Part Interop COM no Visual Studio 1. 2. 3. 4. 5. 1. 2. 3. 4. No Solution Explorer, clique com o projeto COMClient, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, digite um nome. Clique em OK. No menu Debug, clique em Start Without Debugging. Use o Change Directory comando para alterar para o diretrio COMInteropPart2\COMClient. Copie o cdigo do servidor C# para o diretrio COMClient: copy ..\CSharpServer\CSharpServer.cs Compilar o servidor: csc /target:library CSharpServer.cs regasm CSharpServer.dll /tlb:CSharpServer.tlb Compilar o cliente (verifique se as variveis Caminho e ambiente so definidas corretamente com vcvars32.bat):: cl COMClient.cpp 5. Execute o cliente: COMClient friend
Para criar e executar o Exemplo 2 Part Interop COM a partir da linha de comando
Exemplo atributos
Download sample Este Exemplo demonstra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Para obter mais informaes sobre atributos, consulte Atributos (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre.
Visual C# Consolidado
289
3.
Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo atributos no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc AttributesTutorial.cs AttributesTutorial
Exemplo de segurana
Download sample Este Exemplo demonstra como modificar as permisses de segurana atravs de classes de permisso e atributos de permisso. Para obter informaes adicionais, consulte Segurana (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos de segurana no Visual Studio 1. 2. No Solution Explorer, clique com o projeto Security1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging.
Visual C# Consolidado
290
3. 1. 2. 3. 4. 5. 6.
Repita as etapas anteriores para Security2 e Security3. Use o Change Directory comando para alterar para o diretrio Security1. Digite o seguinte: csc ImperativeSecurity.cs ImperativeSecurity Use o Change Directory comando para alterar para o diretrio Security2. Digite o seguinte: csc DeclarativeSecurity.cs DeclarativeSecurity Use o Change Directory comando para alterar para o diretrio Security3. Digite o seguinte: csc SuppressSecurity.cs SuppressSecurity
Segmentao de Exemplo
Download sample Este Exemplo demonstra as seguintes tcnicas segmentao. Consulte Segmentao (guia de programao C#) Para obter mais informaes.
Criar, iniciar, e Finalizando um segmento Usando um pool de segmentos Segmento Sincronizao e interao Observao de segurana
Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Threading no Visual Studio
Visual C# Consolidado
291
1. 2. 3. 1. 2. 3. 4.
No Solution Explorer, clique com o projeto ThreadStartStop e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para ThreadPool, e ThreadSync. Use o Change Directory comando para alterar para o diretrio segmentos. Digite o seguinte: cd ThreadStartStop csc ThreadStartStop.cs ThreadStartStop Digite o seguinte: cd ..\ThreadPool csc ThreadPool.cs ThreadPool Digite o seguinte: cd ..\ThreadSync csc ThreadSync.cs ThreadSync
Visual C# Consolidado
292
3. 4. 5. 6. 7. 8. 9.
No Solution Explorer, clique com o projeto ReadFile, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto ReadFile, e clique em Properties. Abra a pasta Propriedades de configurao, e clique em Debug. Na propriedade argumentos da linha de comando, insira ..\..\ReadFile.cs. Clique em OK. No menu Debug, clique em Start Without Debugging. No Solution Explorer, clique com o projeto PrintVersion, e clique em Set as StartUp Project.
10. No menu Debug, clique em Start Without Debugging. Para criar e executar os exemplos de cdigo UNSAFE a partir da linha de comando 1. 2. 3. 4. Use o Change Directory comando para alterar para o diretrio UNSAFE. Digite o seguinte: cd FastCopy csc FastCopy.cs /unsafe FastCopy Digite o seguinte: cd ..\ReadFile csc ReadFile.cs /unsafe ReadFile ReadFile.cs Digite o seguinte: cd ..\PrintVersion csc PrintVersion.cs /unsafe PrintVersion
Exemplo BD OLE
Download sample Este Exemplo demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados. O banco de dados BugTypes.MDB usado no programa de Exemplo um arquivo.mdb do Microsoft Access 2000. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.
Visual C# Consolidado
293
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de banco de dados OLE no Visual Studio
No menu Debug, clique em Start Without Debugging. Observao Se voc estiver criando a soluo no modo Release, copie BugTypes.mdb para a pasta \bin\release.
Produzir Exemplo
Download sample Este Exemplo mostra como criar uma classe lista que implementa IEnumerable<int> e palavra-chave yield Para ativar foreach iterao atravs do contedo da lista. Duas propriedades so definidas, um retornar os nmeros mpares, o outro retornar os nmeros pares. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo YIELD cdigo no Visual Studio
Visual C# Consolidado
294
1. 2.
Use o Change Directory (cd) comando para alterar para o Yield Diretrio. Digite o seguinte: csc Yield.cs Yield
No menu Debug, clique em Start Without Debugging. 1. 2. Use o Change Directory (cd) comando para alterar para o diretrio AnonymousDelegates. Digite o seguinte: csc AnonymousDelegates.cs AnonymousDelegates
Visual C# Consolidado
295
No menu Debug, clique em Start Without Debugging. 1. 2. Use o Change Directory (cd) comando para alterar para o PartialTypes Diretrio. Digite o seguinte: csc PartialTypes.cs PartialTypes
Exemplo anulvel
Download sample Este Exemplo demonstra o uso de tipos anulveis. Esse recurso permite que tipos de valores para que um estado no inicializada, ou vazio, semelhante a como tipos de referncia podem ser definidos como null. Este Observao de segurana cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada
Visual C# Consolidado
296
Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Nullable cdigo no Visual Studio 1. 2. 1. 2. Abra Nullable.sln, o arquivo de soluo, o clicando duas vezes no arquivo no Windows Explorer, ou clicando Open no menu File. No menu Debug, clique em Start Without Debugging. Use o Change Directory (cd) comando para alterar para o diretrio Nullable. Digite o seguinte: csc Nullable.cs Nullable
Visual C# Consolidado
297
TERMINOLOGIA C#
Modificador de acesso Uma palavra-chave, como Particular, Protegido ou Pblica, que restringe o acesso a um tipo ou membro Tipo., interno Para obter mais informaes, consulte Modificadores de acesso. Membro acessvel Um membro que pode ser acessado por um tipo determinado. Um membro acessvel para um tipo no est necessariamente acessvel para um outro tipo. Para obter mais informaes, consulte Modificadores de acesso e Conjuntos de amigo. Assessor Um mtodo que Define ou recupera o valor de um valor que est associado a uma propriedade membro dados particulares. Propriedades de leitura-gravao e set ter get assessores. Propriedades que so somente leitura tm apenas um get acessador. Para obter mais informaes, consulte Propriedades. Mtodo annimo Um mtodo annimo um bloco de cdigo que passado como um parmetro para um Delegar. Para obter mais informaes, consulte Mtodos annimo. Classe base Uma Classe que herdado por outra classe ' derivado '. Para obter mais informaes, consulte Herana. Chamar pilha A srie de mtodo chama esquerda do incio do programa para a instruo atualmente sendo executado em tempo de execuo. Classe Um tipo de dados que descreve um objeto. Classes conter dados, e os mtodos para agir sobre os dados. Para obter mais informaes, consulte Classes. Construtor Um mtodo especial em class ou struct que inicializa os objetos do mesmo tipo. Para obter mais informaes, consulte Construtores. Delegar Um representante um tipo que referencia um mtodo. Depois que um representante atribudo um mtodo, ele funciona exatamente como esse mtodo. Para obter mais informaes, consulte Representantes. Classe derivada Um Classe que usa herana para obter, aumentar, ou modificar o comportamento e dados de outra classe ' base '. Para obter mais informaes, consulte Herana. destruidor Um mtodo especial em ou struct que prepara a instncia para Destruio pelo sistema. um Classe Para obter mais informaes, consulte Destructors. Evento Um membro da OU struct que envia notificaes de alterao. um Classe Para obter mais informaes, consulte Eventos.
Visual C# Consolidado
298
Campo Um membro de dados ou struct que acessado diretamente. um Classe generics Generics permitir que voc a definir e ou mtodo que so definidas com um parmetro de tipo. um Classe Quando cdigo cliente instancia o tipo, ele especifica um tipo especfico como um argumento. Para obter mais informaes, consulte Generics. IDE Ambiente de desenvolvimento integrado. O aplicativo que fornece a interface do usurio unificada para as ferramentas de desenvolvimento vrios incluindo o compilador, depurador, editor de cdigo, e designers. Tipo imutvel Um tipo cujos dados de instncia, campos e propriedades, no altera depois a instncia for criada. A maioria dos tipos valor so imutveis. Membro inacessvel Um membro que no pode ser acessado por um tipo determinado. Um membro inacessvel para um tipo no necessariamente inacessvel para outro tipo. Para obter mais informaes, consulte Modificadores de acesso. Herana C# herana oferece suporte, para uma Classe que deriva de outra classe, conhecido como a classe base, herda os mesmos mtodos e propriedades. Herana envolve classes base e classes derivadas. Para obter mais informaes, consulte Herana. Interface Um tipo que contm somente as assinaturas de mtodos pblicos, eventos e representantes. Um objeto que herda a interface deve implementar todos os mtodos e eventos definidos na interface. Classes ou estruturas podem herdar qualquer nmero de interfaces. Para obter mais informaes, consulte Interfaces iterador Um iterador um mtodo que permite que os consumidores de uma Classe que contm uma coleo ou matriz para usar foreach, na referncia (C#) para percorrer essa coleo ou matriz. Membro Um campo, propriedade, mtodo, ou evento declarado no ou struct. um Classe Mtodo Um bloco de cdigos nomeado que fornece comportamento para ou struct. um Classe Tipo mutveis Um tipo cujos dados de instncia, campos e propriedades, podem ser alteradas aps a ocorrncia criada. A maioria Tipos de referncia est mutveis. tipo aninhado Um tipo declarado na declarao de outro tipo. object Uma instncia de um Classe. Um objeto existe na memria, e tem dados e mtodos que atuam sobre os dados. Para obter mais informaes, consulte Objetos, classes, e Structs. Propriedade
Visual C# Consolidado
299
Um membro de dados acessado por meio de um acessador. Para obter mais informaes, consulte Propriedades. refatorao Reutilizando anteriormente digitado cdigo. Visual Express Editor cdigo C# inteligentemente pode reformatar cdigo para, por exemplo, transformar um bloco de cdigo de realce em um mtodo. Para obter mais informaes, consulte Refatorao. Tipo de referncia Um tipo de dados. Uma varivel declarada como um ponto Tipo de referncia para um local em que os dados so armazenados. Para obter mais informaes, consulte Tipos de referncia. static Existe uma classe ou mtodo declarado como esttico sem primeiro sendo instanciado usando a palavra-chave new. Main() um mtodo esttico. Para obter mais informaes, consulte Classes estticas e membros de classe estticos. struct Um tipo composto dados que normalmente usado para conter algumas variveis que tm alguma relao lgica. Structs tambm podem conter mtodos e eventos. Structs no oferecerem suporte herana mas eles fazer suporte interfaces. uma estrutura a Tipo de valor,. enquanto um Classe um Tipo de referncia Para obter mais informaes, consulte Structs. Tipo de valor Um tipo de valor um tipo de dados que est alocado na pilha, em um tipo de referncia que alocado em pilha vez. Incluindo o Tipos internas, os tipos numricos, bem como o tipo estrutura e o tipo anulvel, so todos os tipos valor. O Classe tipo e Seqncia Tipo so Tipos de referncia. Para obter mais informaes, consulte Tipos valor (referncia C#).
Visual C# Consolidado
300
EXEMPLOS DO VISUAL C#
Voc pode acessar cdigo de exemplo, procurando resumos de Exemplo nesta seo. Cada abstrato contm um link para abrir ou copiar o Exemplo na arquivos. Alm disso, o SDK do .NET Framework inclui tecnologia e aplicativo Exemplos e tutoriais QuickStart que demonstram recursos .NET Framework e cdigo Visual C#. Os tutoriais QuickStart so a maneira mais rpida para entender o que a tecnologia .NET Framework oferece desenvolvedores lder-borda. Os QuickStarts so uma srie de exemplos e suporte documentao projetadas para rapidamente acquaint voc com a sintaxe, arquitetura, e poder do Visual Studio e o .NET Framework. Do ASP.NET Os tutoriais QuickStart inclui exemplos na e aplicativos Windows Forms, alm de muitos aplicativos instruo que abrangem os recursos da tecnologia .NET Framework mais atraentes. Para acessar o QuickStarts, clique em Start, aponte para Programs, aponte para Microsoft .NET Framework SDK v2.0, e clique em QuickStart Tutorials. Uma pgina da Web do aplicativo " tutoriais QuickStart SDK Microsoft .NET Framework " exibida. Para executar o QuickStarts, siga as instrues na pgina, que configura o banco de dados amostras e conclui a instalao. Para obter mais informaes, consulte Amostras e QuickStarts. Nesta seo Exemplos de introduo Annimo Exemplo representantes Exemplo matrizes Coleo Exemplo classes Exemplo generics (C#) Demonstra o uso de representantes para reduzir a complexidade de aplicativos sem nome. Mostra como usar matrizes. Mostra como fazer classes coleo Generic no-que podem ser usados com a foreach instruo. Mostra como fazer classes a coleo genrica que podem ser usados com a foreach instruo.
Exemplo de parmetros Demonstra simples processamento de linha de comando e matriz da linha de comando indexao. Exemplo dos Mtodos condicional Demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido.
Exemplo representantes Mostra como representantes so declaradas, mapeado, e combinados. Exemplo eventos Exemplo de implementao de interface explcita Mostra como usar eventos em C#. Demonstra como explicitamente implementar membros de interface.
Visual C# Consolidado
301
Mostra como usar notao de matriz para acessar um objeto. Mostra como a implementar uma classe que usa propriedades indexadas. Propriedades indexadas permitem que voc para usar uma classe que representa uma coleo de vrios tipos diferentes de itens semelhantes matriz-. Mostra como propriedades so declaradas e usados; tambm demonstra propriedades abstratas. Mostra como usar structs em C#. Mostra como definido pelo usurio classes poder sobrecarregar operadores. Mostra como definir converses de e para tipos definidos pelo usurio.
Exemplo propriedades
Exemplo Structs Exemplo Overloading do operador Exemplo Conversions definidas pelo usurio Exemplo de verso
Do override demonstra verso em C# atravs do uso de e new palavras-chave. Demonstra a palavra-chave rendimento para filtrar itens em uma coleo.
Produzir exemplo
Exemplos intermedirio e Avanado Exemplo atributos Mostra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Mostra como usar C# para interoperar com objetos COM.
Exemplo parte 1 Interop COM Exemplo parte 2 Interop COM Exemplo bibliotecas
Mostra como usar opes do compilador para criar uma DLL de vrios arquivos de origem; alm disso, como usar a biblioteca em outros programas. Demonstra tipos de valores que podem ser definidos como nulo. Demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados.
Visual C# Consolidado
302
Exemplo tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios arquivos cdigo fonte-C#. Plataforma Invoke exemplo Exemplo de segurana Mostra como chamar exportadas funes DLL do C#.
Discute a segurana do .NET Framework e mostra duas maneiras de modificar as permisses de segurana em C#: Usando classes de permisso e atributos de permisso. Demonstra vrias atividades do segmento, como criando e executando um segmento, sincronizando segmentos, interagir entre segmentos, e usando um pool de segmentos. Mostra como usar ponteiros.
Segmentao de exemplo
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz a soluo do projeto no confivel. Clique OK para continuar. Para criar e executar os exemplos hello world no Visual Studio
Visual C# Consolidado
303
17. Abra a soluo (HelloWorld.sln). 18. No Solution Explorer, clique com o projeto HelloWorld1, e clique em Set as StartUp Project. 19. No menu Debug, clique em Start Without Debugging. 20. Pressione qualquer tecla para fechar HelloWorld1. 21. No Solution Explorer, clique com o projeto HelloWorld2, e clique em Set as StartUp Project. 22. No menu Debug, clique em Start Without Debugging. 23. Pressione qualquer tecla para fechar HelloWorld2. 24. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Set as StartUp Project. 25. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Properties. 26. Abra a Configuration Properties pasta, e clique em Debug. 27. Na Command Line Arguments propriedade, tipo A B C D e clique em OK. 28. No menu Debug, clique em Start Without Debugging. 29. Pressione qualquer tecla para fechar HelloWorld3. 30. No Solution Explorer, clique com o projeto HelloWorld4, e clique em Set as StartUp Project. 31. No menu Debug, clique em Start Without Debugging. 32. Pressione qualquer tecla para fechar HelloWorld4. Para criar e executar os exemplos hello world a partir da linha de comando 6. 7. 8. 9. Use o Change Directory comando para alterar para o diretrio HelloWorld. Digite o seguinte: cd HelloWorld1 csc Hello1.cs Hello1 Digite o seguinte: cd ..\HelloWorld2 csc Hello2.cs Hello2 Digite o seguinte: cd ..\HelloWorld3 csc Hello3.cs Hello3 A B C D 10. Digite o seguinte: cd ..\HelloWorld4 csc Hello4.cs Hello4
Visual C# Consolidado
304
cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos parmetros de linha de comando no Visual Studio 7. 8. 9. No Solution Explorer, clique com o projeto CmdLine1, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug.
10. Na propriedade Command Line Arguments, digite os parmetros da linha de comando, e clique em OK. (Consulte o tutorial para obter um exemplo.) 11. No menu Debug, clique em Start Without Debugging. 12. Repita as etapas anteriores para CmdLine2. Para criar e executar os exemplos parmetros de linha de comando a partir da linha de comando 5. 6. 7. 8. Use o Change Directory comando para alterar para o diretrio CmdLine1. Digite o seguinte: csc cmdline1.cs cmdline1 A B C Use o Change Directory comando para alterar para o diretrio CmdLine2. Digite o seguinte: csc cmdline2.cs cmdline2 John Paul Mary
Exemplo matrizes
Download sample Este Exemplo descreve e mostra como matrizes funcionam em C#. Para obter mais informaes, consulte Matrizes (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o
Visual C# Consolidado
305
cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo matrizes no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc arrays.cs arrays
Exemplo propriedades
Download sample Este Exemplo mostra como propriedades so uma parte integral da C# linguagem de programao. Ele demonstra como propriedades so declaradas e usados. Consulte Propriedades Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente.
Visual C# Consolidado
306
Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos propriedades no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto pessoa e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para shapetest. Use o Change Directory comando para alterar para o diretrio pessoa. Digite o seguinte: csc person.cs person Use o Change Directory comando para alterar para o diretrio shapetest. Digite o seguinte: csc abstractshape.cs shapes.cs shapetest.cs shapetest
Exemplo bibliotecas
Download sample Este Exemplo mostra como criar e usar uma DLL em C#. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo bibliotecas no Visual Studio
Visual C# Consolidado
307
7. 8. 9.
No Solution Explorer, clique com o projeto FunctionTest, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto FunctionTest, e clique em Properties. Abra a Configuration Properties pasta e clique em Debug.
10. Na propriedade Command Line Arguments, insira 3 5 10. 11. Clique em OK. 12. No menu Debug, clique em Start Without Debugging. Isso automaticamente criar a biblioteca em funes e executar o programa. Para criar e executar o Exemplo bibliotecas a partir da linha de comando 5. 6. 7. 8. Use o Change Directory comando para alterar para o diretrio funes. Digite o seguinte: csc /target:library /out:Functions.dll Factorial.cs DigitCounter.cs Use o Change Directory comando para alterar para o diretrio FunctionTest. Digite o seguinte: copy ..\Functions\Functions.dll . csc /out:FunctionTest.exe /R:Functions.DLL FunctionClient.cs FunctionTest 3 5 10
Exemplo de verso
Download sample Este Exemplo demonstra verso em C# atravs do uso de e new palavras-chave. o override Verso ajuda manter a compatibilidade entre classes base e derivados como eles evoluir. Para obter informaes adicionais, consulte Verso com o substituio e palavras-chave new (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln.
Visual C# Consolidado
308
A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo verso no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc versioning.cs versioning
Visual C# Consolidado
309
7. 8.
Use o Change Directory comando para alterar para o diretrio CollectionClasses2. Digite o seguinte: csc tokens2.cs tokens2
Exemplo Structs
Download sample Este Exemplo apresenta a sintaxe e uso de estruturas. Ele tambm aborda as diferenas importantes entre classes e estruturas. Consulte Objetos, classes e Structs (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Structs no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto Struct1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Struct2. Use o Change Directory comando para alterar para o diretrio Struct1. Digite o seguinte: csc struct1.cs struct1 Use o Change Directory comando para alterar para o diretrio Struct2. Digite o seguinte: csc struct2.cs struct2
Visual C# Consolidado
310
Exemplo indexadores
Download sample Este Exemplo mostra como classes C# podem declarar indexadores para fornecer acesso semelhante matriz-s classes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Indexers no Visual Studio 6. 7. 8. 9. No Solution Explorer, clique com o projeto indexadores, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, insira ..\..\Test.txt. Clique em OK.
10. No menu Debug, clique em Start Without Debugging. Para criar e executar o Exemplo Indexers a partir da linha de comando 3. Para compilar o programa de exemplo, digite o seguinte no prompt de comando: csc indexer.cs O programa de Exemplo inverte os bytes em um arquivo fornecido como um argumento da linha de comando. Por exemplo, para reverter os bytes em Test.txt e ver o resultado, emitir os seguintes comandos: indexers Test.txt type Test.txt 4. Para alterar o arquivo revertido para Normal, execute o programa no mesmo arquivo novamente.
Visual C# Consolidado
311
Este Exemplo mostra como classes C# podem declarar indexadas propriedades para representa uma coleo de tipos diferentes de itens semelhantes matriz-. Para obter mais informaes, consulte Propriedades (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo indexado propriedades no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc indexedproperty.cs indexedproperty
Visual C# Consolidado
312
A File Download caixa de mensagem ser exibida. 5. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Conversions pelo usurio no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto Conversion1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Conversion2. Use o Change Directory comando para alterar para o diretrio Conversion1. Digite o seguinte: csc conversion.cs conversion Use o Change Directory comando para alterar para o diretrio Conversion2. Digite o seguinte: csc structconversion.cs structconversion
Para criar e executar os exemplos Conversions pelo usurio a partir da linha de comando
Visual C# Consolidado
313
A File Download caixa de mensagem ser exibida. 5. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Generics no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc generics.cs generics
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.
Visual C# Consolidado
314
Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Overloading operador no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto complexo e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Dbbool. Use o Change Directory comando para alterar para o diretrio complexo. Digite o seguinte: csc complex.cs complex Use o Change Directory comando para alterar para o diretrio Dbbool. Digite o seguinte: csc dbbool.cs dbbool
Exemplo representantes
Download sample Este Exemplo demonstra os tipos de representante. Ele mostra como para mapear delegados para estticos e mtodos da instncia, e como combin-las para criar representantes de difuso seletiva. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos representantes no Visual Studio
Visual C# Consolidado
315
4. 5. 6. 5. 6. 7. 8.
No Solution Explorer, clique com o projeto Delegates1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Delegates2. Use o Change Directory comando para alterar para o diretrio Delegates1. Digite o seguinte: csc bookstore.cs bookstore Use o Change Directory comando para alterar para o diretrio Delegates2. Digite o seguinte: csc compose.cs compose
Exemplo eventos
Download sample Este Exemplo mostra como a declarar, chamar, e configurar eventos em C#. Para obter mais informaes, consulte Eventos (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos eventos no Visual Studio 4. 5. 6. No Solution Explorer, clique com o projeto Events1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Events2.
Visual C# Consolidado
316
5. 6. 7. 8.
Use o Change Directory comando para alterar para o diretrio Events1. Digite o seguinte: csc events1.cs events1 Use o Change Directory comando para alterar para o diretrio Events2. Digite o seguinte: csc events2.cs events2
Para criar e executar os exemplos Explicit implementao interface a partir da linha de comando
Visual C# Consolidado
317
8.
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
Visual C# Consolidado
318
Este Exemplo mostra como usar XML ao documento cdigo. Consulte Comentrios de documentao XML (Guia de programao C#) Para obter informaes adicionais. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar o Exemplo documentao XML no Visual Studio 5. 6. 7. 8. No Solution Explorer, clique com o projeto e clique em Properties. Abra a pasta Propriedades de configurao e clique em Build. Defina a propriedade arquivo documentao XML como XMLsample.xml. No menu Build, clique em Build. O arquivo de sada XML poder ser no diretrio de depurao. Para gerar a documentao XML de exemplo, digite o seguinte no prompt de comando: csc XMLsample.cs /doc:XMLsample.xml 4. Para ver o XML gerado, emita o seguinte comando: type XMLsample.xml
Visual C# Consolidado
319
que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Platform Invoke no Visual Studio 4. 5. 6. 7. 8. 9. No Solution Explorer, clique com o projeto PinvokeTest e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Marshal e PInvoke. Use o Change Directory comando para alterar para o diretrio PinvokeTest. Digite o seguinte: csc PinvokeTest.cs PinvokeTest Use o Change Directory comando para alterar para o diretrio Marshal. csc Marshal.cs Marshal 11. Use o Change Directory comando para alterar para o diretrio PInvoke. 12. Digite o seguinte: csc logfont.cs pinvoke.cs pinvoke 10. Digite o seguinte:
Visual C# Consolidado
320
cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos com Interop parte 1 no Visual Studio 8. 9. No Solution Explorer, clique com o projeto Interop1, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto Interop1, e clique em Properties.
10. Abra a Configuration Properties pasta, e clique em Debug. 11. Na propriedade argumentos de linha de comando, digite um arquivo AVI como c:\winnt\clock.avi. 12. Clique em OK. 13. No menu Debug, clique em Start Without Debugging. 14. Repita as etapas anteriores para Interop2. Se o QuartzTypeLib.dll includo com Interop1 est desatualizado 7. 8. 9. No Solution Explorer, abrir References para Interop1. Clique com o boto direito do mouse QuartzTypeLib e, clique em Remove. Clique com o boto direito do mouse References e, clique em Add Reference.
10. Na guia COM, selecione o componente denominado, " biblioteca Tipo de Controle ActiveMovie ". 11. Clique em Select e, clique em OK. 12. Recrie Interop1. Observao Adicionando uma referncia para o componente faz a mesma coisa que chamar TLBIMP na linha de comando para criar QuartzTypeLib.dll (como mostrado abaixo). Para criar e executar os exemplos com Interop Parte 1 a partir da linha de comando 5. Use o Change Directory comando para alterar para o diretrio Interop1.
Visual C# Consolidado
321
6.
Digite o seguinte: tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dll csc /r:QuartzTypeLib.dll interop1.cs interop1 %windir%\clock.avi
7. 8.
Use o Change Directory comando para alterar para o diretrio Interop2. Digite o seguinte: csc interop2.cs interop2 %windir%\clock.avi
Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo 2 Part Interop COM no Visual Studio 6. 7. 8. 9. No Solution Explorer, clique com o projeto COMClient, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, digite um nome. Clique em OK.
Visual C# Consolidado
322
Para criar e executar o Exemplo 2 Part Interop COM a partir da linha de comando 6. 7. 8. 9. Use o Change Directory comando para alterar para o diretrio COMInteropPart2\COMClient. Copie o cdigo do servidor C# para o diretrio COMClient: copy ..\CSharpServer\CSharpServer.cs Compilar o servidor: csc /target:library CSharpServer.cs regasm CSharpServer.dll /tlb:CSharpServer.tlb Compilar o cliente (verifique se as variveis Caminho e ambiente so definidas corretamente com vcvars32.bat):: cl COMClient.cpp 10. Execute o cliente: COMClient friend
Exemplo atributos
Download sample Este Exemplo demonstra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Para obter mais informaes sobre atributos, consulte Atributos (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo atributos no Visual Studio
No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando:
Visual C# Consolidado
323
Exemplo de segurana
Download sample Este Exemplo demonstra como modificar as permisses de segurana atravs de classes de permisso e atributos de permisso. Para obter informaes adicionais, consulte Segurana (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos de segurana no Visual Studio 4. 5. 6. 7. 8. 9. No Solution Explorer, clique com o projeto Security1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Security2 e Security3. Use o Change Directory comando para alterar para o diretrio Security1. Digite o seguinte: csc ImperativeSecurity.cs ImperativeSecurity Use o Change Directory comando para alterar para o diretrio Security2. csc DeclarativeSecurity.cs DeclarativeSecurity 11. Use o Change Directory comando para alterar para o diretrio Security3. 12. Digite o seguinte: csc SuppressSecurity.cs SuppressSecurity 10. Digite o seguinte:
Visual C# Consolidado
324
Segmentao de Exemplo
Download sample Este Exemplo demonstra as seguintes tcnicas segmentao. Consulte Segmentao (guia de programao C#) Para obter mais informaes.
Criar, iniciar, e Finalizando um segmento Usando um pool de segmentos Segmento Sincronizao e interao Observao de segurana
Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Threading no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto ThreadStartStop e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para ThreadPool, e ThreadSync. Use o Change Directory comando para alterar para o diretrio segmentos. Digite o seguinte: cd ThreadStartStop csc ThreadStartStop.cs ThreadStartStop Digite o seguinte: cd ..\ThreadPool csc ThreadPool.cs ThreadPool Digite o seguinte: cd ..\ThreadSync csc ThreadSync.cs ThreadSync
Visual C# Consolidado
325
Visual C# Consolidado
326
7. 8.
Digite o seguinte: cd ..\ReadFile csc ReadFile.cs /unsafe ReadFile ReadFile.cs Digite o seguinte: cd ..\PrintVersion csc PrintVersion.cs /unsafe PrintVersion
Exemplo BD OLE
Download sample Este Exemplo demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados. O banco de dados BugTypes.MDB usado no programa de Exemplo um arquivo.mdb do Microsoft Access 2000. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de banco de dados OLE no Visual Studio
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
Visual C# Consolidado
327
Produzir Exemplo
Download sample Este Exemplo mostra como criar uma classe lista que implementa IEnumerable<int> e palavra-chave yield Para ativar foreach iterao atravs do contedo da lista. Duas propriedades so definidas, um retornar os nmeros mpares, o outro retornar os nmeros pares. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo YIELD cdigo no Visual Studio
No menu Debug, clique em Start Without Debugging. 3. 4. Use o Change Directory (cd) comando para alterar para o Yield Diretrio. Digite o seguinte: csc Yield.cs Yield
Visual C# Consolidado
328
Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de cdigo AnonymousDelegates no Visual Studio
No menu Debug, clique em Start Without Debugging. 3. 4. Use o Change Directory (cd) comando para alterar para o diretrio AnonymousDelegates. Digite o seguinte: csc AnonymousDelegates.cs AnonymousDelegates
Visual C# Consolidado
329
A File Download caixa de mensagem ser exibida. 5. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de cdigo PartialTypes no Visual Studio
No menu Debug, clique em Start Without Debugging. 3. 4. Use o Change Directory (cd) comando para alterar para o PartialTypes Diretrio. Digite o seguinte: csc PartialTypes.cs PartialTypes
Exemplo anulvel
Download sample Este Exemplo demonstra o uso de tipos anulveis. Esse recurso permite que tipos de valores para que um estado no inicializada, ou vazio, semelhante a como tipos de referncia podem ser definidos como null. Este Observao de segurana cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Nullable cdigo no Visual Studio
Visual C# Consolidado
330
3. 4. 3. 4.
Abra Nullable.sln, o arquivo de soluo, o clicando duas vezes no arquivo no Windows Explorer, ou clicando Open no menu File. No menu Debug, clique em Start Without Debugging. Use o Change Directory (cd) comando para alterar para o diretrio Nullable. Digite o seguinte: csc Nullable.cs Nullable
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
Visual C# Consolidado
334
Construtores de instncia (Guia de programao C#) Explica construtores de classe e herana. Propriedades COMO: Declarar e usar propriedades de leitura/escrita (Guia de programao C#) Contm um exemplo que mostra como declarar e usar propriedades de leitura/escrita. COMO: Definir propriedades abstratas (Guia de programao C#) Contm um exemplo de cdigo que mostra como definir propriedades abstratas. Eventos COMO: Criar um controle que responde a eventos (Guia de programao C#) Contm um exemplo de cdigo que mostra uma classe, ListWithChangedEvent, que semelhante classe padro ArrayList mas tambm chama um evento Changed sempre que o contedo da lista alterado. COMO: Criar eventos que estejam de acordo com as diretrizes do .NET Framework (Guia de programao C#) Contm um exemplo que cria um controle que responde a eventos, seguindo as orientaes das .NET Framework Guidelines. COMO: Declarar um evento em uma interface e implement-lo em uma classe (Guia de programao C#) Mostra que possvel declarar um evento em uma interface e implement-lo em uma classe. COMO: Usar um dicionrio para armazenar instncias de eventos (Guia de programao C#) Explica como usar uma tabela de hash para armazenar as instncias de eventos. COMO: Implementar duas interfaces que possuam um evento com o mesmo nome (Guia de programao C#) Explica a situao onde voc implementa duas interfaces, cada uma com um evento com o mesmo nome. Nesse caso, voc deve usar uma propriedade de evento explicitamente de implementao. COMO: Criar manipuladores de evento no Visual C# Code Editor (Guia de programao C#) Oferece uma maneira fcil para criar manipuladores de eventos para seus Windows Forms quando no modo de design. A alternativa exibir o cdigo fonte no modo de exibio Source e adicionar o manipulador de eventos no cdigo. Interfaces COMO: Implementar explicitamente membros de uma interface (Guia de programao C#) Mostra como declarar uma classe que explicitamente implementa uma interface e como acessar seus membros atravs da instncia da interface.
Visual C# Consolidado
335
COMO: Implementar explicitamente membros de uma interface com herana (Guia de programao C#) Fornece um exemplo que exibe as dimenses de uma caixa em unidades mtrica e do sistema ingls. Classes Genricas Uma introduo ao Generics C# Descreve como classes genricas permitem que voc defina classes de coleo que so fortemente tipadas (Type-Safe). Voc implementa a classe genrica somente uma vez, mas voc pode declar-la e us-la com qualquer tipo. Classes genricas no .NET Framework Explica os recursos e o uso do novo conjunto de colees genricas no espao de nomes System.Collections.Generic. A palavra-chave default em cdigo fonte "genrico" (Guia de programao C#) Fornece um exemplo de cdigo que demonstra como usar a palavra-chave default para tipo parmetros. Mtodos genricos (Guia de programao C#) Apresenta a sintaxe para declarar um mtodo genrico. E tambm mostra um exemplo de como usar mtodos genricos em um aplicativo. Restries em parmetros de tipo (Guia de programao C#) Mostra como restringir parmetros de tipo para permitir o acesso a mtodos e propriedades dos tipos usados para instanciar a classe genrica. Representantes genricos (Guia de programao C#) Contm a sintaxe para declarar representantes (delegates) genricos. E tambm inclui comentrios importantes sobre como instanciar e usar representantes genricos, assim como exemplos de cdigo. Espaos de nomes COMO: Usar o qualificador de espao de nomes Alias (Guia de programao C#) Discute a capacidade de acessar um membro no espao de nomes global quando o membro pode estar oculto por outra entidade com o mesmo nome. Iteradores COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#) Fornece um exemplo onde um vetor de inteiros usado para criar a lista SampleCollection. Um lao for itera atravs da coleo e produz o valor de cada item. Depois um lao foreach usado para exibir os itens da coleo. COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#)
Visual C# Consolidado
336
Fornece um exemplo onde uma classe genrica Stack<T> implementa uma interface genrica IEnumerator<T>. Um vetor de T tipo declarado e a ele so atribudos valores usando o mtodo Push. No mtodo GetEnumerator, os valores do vetor so retornados usando a instruo de retorno yield. Representantes (Delegates) COMO: Combinar representantes (Representantes Multicast) (Guia de programao C#) Fornece um exemplo que demonstra como compor representantes de difuso seletiva. COMO: Declarar, instanciar e usar um representante (Guia de programao C#) Fornece um exemplo que ilustra como declarar, criar e usar um representate (delegate). Sobrecarga de operador COMO: Usar sobrecarga de operador para criar uma classe para nmeros complexos (Guia de programao C#) Mostra como voc pode utilizar sobrecarga de operador para criar uma classe para nmeros complexos chamada Complex e que define adio de complexos. Interoperabilidade COMO: Usar interoperabilidade COM para verificar ortografia usando o Word (Guia de programao C#) Este exemplo ilustra como usar o verificador ortogrfico do Word em um aplicativo C#. COMO: Usar interoperabilidade COM para criar uma planilha do Excel (Guia de programao C#) Este exemplo ilustra como abrir uma planilha j existente do Excel em C# usando funcionalidades de interoperabilidade COM no .NET Framework. COMO: Usar cdigo gerenciado como um suplemento de automao para o Excel (Guia de programao C#) Este exemplo ilustra como criar um suplemento C# para calcular taxa de imposto de renda em uma clula em uma planilha do Excel. COMO: Usar servios de chamada da plataforma para reproduzir um arquivo WAVE (Guia de programao C#) Este exemplo ilustra como usar servios de chamada da plataforma para reproduzir um arquivo de som wave na plataforma Windows. Cdigo no gerenciado COMO: Usar ponteiros para copiar um vetor de bytes (Guia de programao C#) Mostra como usar ponteiros para copiar bytes de um vetor para outro, usando ponteiros. COMO: Usar a funo ReadFile do Windows (Guia de programao C#) Mostra como chamar a funo ReadFile do Windows, que requer o uso de um contexto no gerenciado pois o buffer de leitura requer um ponteiro como parmetro.
Visual C# Consolidado
337
Lidando com threads Usando segmentos e Threading Fornece uma lista de tpicos que abordam a criao e o gerenciamento de threads gerenciados e como evitar conseqncias no intencionais. COMO: Criar e terminar threads (Guia de programao C#) Fornece um exemplo que demonstra como criar e iniciar uma thread e mostra a interao entre duas threads em execuo simultnea dentro do mesmo processo. COMO: Sincronizar uma thread Produtor e uma thread Consumidor (Guia de programao C#) Fornece um exemplo que mostra como sincronizao pode ser feita usando a palavrachave lock de C# e o mtodo Pulse do objeto Monitor. COMO: Usar um pool de threads (Guia de programao C#) Explica um exemplo que mostra como usar um pool de threads. Seqncias de caracteres COMO: Pesquisar em seqncias de caracteres utilizando expresses regulares (Guia de programao C#) Explica como a classe Regex pode ser usada para procurar em seqncias. Essas pesquisas podem variar em complexidade de muito simples a fazer uso total de expresses regulares. COMO: Unir vrias seqncias de caracteres (Guia de programao C#) Contm um exemplo que demonstra como unir vrias seqncias de caracteres. COMO: Pesquisar em seqncias de caracteres utilizando mtodos de String (Guia de programao C#) Contm um exemplo de cdigo que demonstra como usar mtodos de String para procurar em uma seqncia. COMO: Analisar seqncias usando o mtodo Split (Guia de programao C#) Contm um exemplo de cdigo que demonstra como uma seqncia pode ser analisada usando o mtodo System.String.Split. Atributos COMO: Criar uma unio C/C++ usando atributos (Guia de programao C#) Contm um exemplo que usa o atributo serializable para aplicar uma caracterstica especfica a uma classe. Trabalhando com DLLs COMO: Criar e usar DLLs em C# (Guia de programao C#) Demonstra a criao e o uso de uma DLL, usando um cenrio de exemplo.
Visual C# Consolidado
338
Mdulos (assemblies) COMO: Determinar se um arquivo um mdulo (assembly) (Guia de programao C#) Contm um exemplo que testa uma DLL para verificar se ela um mdulo (assembly). COMO: Carregar e descarregar mdulos (assemblies) (Guia de programao C#) Explica como possvel carregar mdulos (assemblies) especficos no domnio de aplicao atual em tempo de execuo. COMO: Compartilhar um mdulo (assembly) com outros aplicativos (Guia de programao C#) Explica como compartilhar um assembly com outros aplicativos. Domnios de aplicao Executar cdigo em outro domnio de aplicao (Guia de programao C#) Mostra como executar um assembly que tenha sido carregado de outro domnio de aplicao. COMO: Criar e usar um domnio de aplicao (Guia de programao C#) Mostra como a sobrecarga de operador pode ser usada para implementar um tipo lgico tri-valorado. Amostras Exemplos no Visual C# Contm links para abrir ou copiar arquivos dos exemplos que vo de Exemplo de Hello World at Exemplo de classes genricas (C#).
Visual C# Consolidado
339
Visual C# Consolidado
340
A caixa de dilogo New Project ser exibida. Esta caixa de dilogo lista os diferentes tipos de aplicativos padro que Visual C# pode criar. 2. 3. Selecione um tipo de aplicativo Starter Kit, e clique em OK. O Starter Kit carregado no Visual C#. Para compilar e iniciar o projeto Starter Kit, pressione F5.
Especificao da Linguagem C#
As verses 1.2 e 2.0 das especificaes da linguagem C# so a fonte autorizada de gramtica e sintaxe C#. Elas contm informaes detalhadas sobre todos os aspectos da linguagem, incluindo muitos pontos no abordados na documentao do produto Visual C#. A especificao 1.2 discute recursos que foram adicionados para a linguagem antes do Visual C# 2005 e a especificao 2.0 discute recursos que foram adicionados para o Visual C# 2005. As especificaes da linguagem C# esto disponveis no formato Microsoft Word nos seguintes locais:
No MSDN Online em http://msdn.microsoft.com/vcsharp/Programming/Language/default.aspx No Visual Studio, na pasta VC#\Specifications\1033\ sob o diretrio de instalao do seu Microsoft Visual Studio 2005 .
Se voc no tiver o Microsoft Word instalado em seu computador, voc pode visualizar, copiar e imprimir a verso do Word da especificao com o gratuito Palavra visualizador 2003. A especificao da linguagem C# tambm est disponvel como um livro publicado pelo Addison Wesley.
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
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
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
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
Especificao da Linguagem C# Para obter mais informaes, consulte as sees a seguir no Especificao da Linguagem C#:
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
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;
Se separado set e get mtodos foram usados para modelar propriedades, o cdigo equivalente pode parecer isso:
person.SetAge(person.GetAge() + 1);
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
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); } }
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.
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
Sada
2 TestString
COMO: Implementar duas interfaces que possuam um evento com o mesmo nome (Guia de programao C#) Outro uso para Evento Propriedades aborda a situao onde voc estiver implementando duas interfaces, cada um com um evento com o mesmo nome. Nesse caso, voc deve usar uma propriedade de evento explicitamente de implementao. No entanto, ao explicitamente implementar eventos na interface, voc precisar fornecer adicionar e remover mtodos. Exemplo C#
public delegate void Delegate1(); public delegate int Delegate2(string s); public interface I1 { event Delegate1 TestEvent; } public interface I2 { event Delegate2 TestEvent; } public class ExplicitEventsSample : I1, I2 { public event Delegate1 TestEvent; // normal implementation of I1.TestEvent. private Delegate2 TestEvent2Storage; // underlying storage for I2.TestEvent. event Delegate2 I2.TestEvent // explicit implementation of I2.TestEvent. { add { TestEvent2Storage += value; } remove { TestEvent2Storage -= value; } } private void FireEvents() { if (TestEvent != null) { TestEvent(); } if (TestEvent2Storage != null) { TestEvent2Storage("hello"); } } }
COMO: Criar manipuladores de evento no Visual C# Code Editor (Guia de programao C#) O Editor de Cdigo Visual C# oferece uma maneira fcil de criar manipuladores de eventos para o Windows Forms enquanto trabalha no modo Design. A alternativa exibir o cdigo fonte no modo de exibio Source e adicionar o manipulador de eventos no cdigo. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Visual Studio configuraes. Para criar um manipulador de eventos usando o Editor de Cdigo Visual C# 1. Se clique com o boto direito do mouse no formulrio ou controle para o qual voc deseja criar um manipulador de eventos, e selecione Properties. no estiver visvel, no modo Design, o Properties Window Na parte superior da Properties Window, clique no boto Events. Clique duas vezes no evento que voc deseja criar, por exemplo o evento Load. Visual C# Cria um mtodo do manipulador de evento vazio e adiciona-o para o seu cdigo. Como alternativa voc pode adicionar o cdigo em mos no modo de exibio de cdigo. Por exemplo as seguintes linhas de cdigo declarar um manipulador de eventos de carga para uma Form classe chamada Form1.
2. 3.
Visual C# Consolidado
354
C#
private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
COMO: Implementar explicitamente membros de uma interface (Guia de programao C#) Este exemplo declara um Interface, IDimensions, e uma classe, Box., explicitamente que implementa os membros getLength de interface e getWidth Os membros so acessados atravs a instncia dimensions interface. Exemplo C#
interface IDimensions { float getLength(); float getWidth(); } class Box : IDimensions { float lengthInches; float widthInches; Box(float length, float width) { lengthInches = length; widthInches = width; } // Explicit interface member implementation: float IDimensions.getLength() { return lengthInches; } // Explicit interface member implementation: float IDimensions.getWidth() { return widthInches; } static void Main() { // Declare a class instance box1: Box box1 = new Box(30.0f, 20.0f); // Declare an interface instance dimensions: IDimensions dimensions = (IDimensions)box1; // The following commented lines would produce compilation // errors because they try to access an explicitly implemented // interface member from a class instance: //System.Console.WriteLine("Length: {0}", box1.getlength()); //System.Console.WriteLine("Width: {0}", box1.getwidth()); // Print out the dimensions of the box by calling the methods // from an instance of the interface: System.Console.WriteLine("Length: {0}", dimensions.getLength()); System.Console.WriteLine("Width: {0}", dimensions.getWidth()); } }
Sada
Length: 30 Width: 20
Programao robusta
Observe que as seguintes linhas no mtodo Main, e so comentadas porque eles produziria erros de compilao. Um membro de interface que implementado explicitamente no pode ser acessado de uma Classe instncia: C#
//System.Console.WriteLine("Length: {0}", box1.getlength()); //System.Console.WriteLine("Width: {0}", box1.getwidth());
Observe tambm que as seguintes linhas no mtodo Main, e com xito imprima as dimenses da caixa porque os mtodos esto sendo chamados de uma instncia da interface: C#
System.Console.WriteLine("Length: {0}", dimensions.getLength()); System.Console.WriteLine("Width: {0}", dimensions.getWidth());
COMO: Implementar explicitamente membros de uma interface com herana (Guia de programao C#) Implementao explcita Interface tambm permite que o programador para implementar duas interfaces que tm os mesmos nomes membro e concedidos aos membros interface uma implementao separada. Este exemplo exibe as dimenses de uma caixa na mtrica e unidades em ingls. As Box Classe interfaces IEnglishDimensions implementa dois e IMetricDimensions, que
Visual C# Consolidado
355
representam os sistemas de medida diferente. As duas interfaces ter nomes idnticos membro, Length e Width. Exemplo C#
// Declare the English units interface: interface IEnglishDimensions { float Length(); float Width(); } // Declare the metric units interface: interface IMetricDimensions { float Length(); float Width(); } // Declare the Box class that implements the two interfaces: // IEnglishDimensions and IMetricDimensions: class Box : IEnglishDimensions, IMetricDimensions { float lengthInches; float widthInches; public Box(float length, float width) { lengthInches = length; widthInches = width; } // Explicitly implement the members of IEnglishDimensions: float IEnglishDimensions.Length() { return lengthInches; } float IEnglishDimensions.Width() { return widthInches; } // Explicitly implement the members of IMetricDimensions: float IMetricDimensions.Length() { return lengthInches * 2.54f; } float IMetricDimensions.Width() { return widthInches * 2.54f; } static void Main() { // Declare a class instance box1: Box box1 = new Box(30.0f, 20.0f); // Declare an instance of the English units interface: IEnglishDimensions eDimensions = (IEnglishDimensions)box1; // Declare an instance of the metric units interface: IMetricDimensions mDimensions = (IMetricDimensions)box1; // Print dimensions in English units: System.Console.WriteLine("Length(in): {0}", eDimensions.Length()); System.Console.WriteLine("Width (in): {0}", eDimensions.Width()); // Print dimensions in metric units: System.Console.WriteLine("Length(cm): {0}", mDimensions.Length()); System.Console.WriteLine("Width (cm): {0}", mDimensions.Width()); } }
Sada
Length(in): 30 Width (in): 20 Length(cm): 76.2 Width (cm): 50.8
Programao robusta Se voc desejar tornar as medidas padro em ingls unidades, implementar os mtodos Length e Width Normalmente, e explicitamente implementar os mtodos Comprimento e Largura da interface IMetricDimensions: C#
// Normal implementation: public float Length() { return lengthInches; } public float Width() { return widthInches; } // Explicit implementation: float IMetricDimensions.Length() { return lengthInches * 2.54f; } float IMetricDimensions.Width() { return widthInches * 2.54f; }
Nesse caso, voc pode acessar as unidades ingls da instncia de classe e acessar as unidades mtrica de interface a instncia: C#
public static void Test() { Box box1 = new Box(30.0f, 20.0f); IMetricDimensions mDimensions = (IMetricDimensions)box1; System.Console.WriteLine("Length(in): {0}", box1.Length()); System.Console.WriteLine("Width (in): {0}", box1.Width()); System.Console.WriteLine("Length(cm): {0}", mDimensions.Length()); System.Console.WriteLine("Width (cm): {0}", mDimensions.Width()); }
Visual C# Consolidado
356
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";
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");
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; } }
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
Especificao da Linguagem C# Para obter mais informaes, consulte as sees a seguir no Especificao da Linguagem C#:
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.
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
declara um novo tipo delegate. Cada tipo delegate descreve o nmero e tipos dos argumentos, e o tipo do valor de retorno dos mtodos que ele pode encapsular. Sempre que um novo
Visual C# Consolidado
370
conjunto de tipos de argumento ou tipo de valor de retorno for necessrio, um novo tipo delegate deve ser declarado.
Instanciar um representante. Depois que um tipo delegate tiver sido declarado, um objeto de representante deve ser criado e associado com um mtodo especfico. No exemplo acima, isso feito, passando o PrintTitle mtodo para o ProcessPaperbackBooks mtodo, como este: C#
bookDB.ProcessPaperbackBooks(PrintTitle);
Isso cria um novo objeto de representante associado o Esttico mtodo Test.PrintTitle. Da mesma forma, passado como este: o mtodo AddBookToTotal no-esttico no objeto totaller C#
bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal);
Em ambos os casos um novo objeto de representante passado para o ProcessPaperbackBooks mtodo. Depois que um representante for criada, o mtodo associado a alteraes nunca; objetos de representante so imutveis.
Chamar um representante. Depois que um objeto de representante for criado, o objeto de representante normalmente passado para outros cdigos que chamar o representante. Um objeto de representante chamado pelo usando o nome do objeto de representante, seguido pelos argumentos parenthesized a serem passados ao representante. Um exemplo de uma chamada de representante : C#
processBook(b);
Um representante ou pode ser chamado de forma sncrona, como, neste exemplo, ou assincronamente por usando BeginInvoke e EndInvoke mtodos. COMO: Usar sobrecarga de operador para criar uma classe para nmeros complexos (Guia de programao C#) Este exemplo mostra como voc pode usar operador sobrecarga para criar uma classe Complex nmero complexo que define adio complexa. O programa exibir o IMAGINARY e as partes dos nmeros e o resultado disso usando uma substituio do mtodo ToString reais. Exemplo C#
public struct Complex { public int real; public int imaginary; public Complex(int real, int imaginary) //constructor { this.real = real; this.imaginary = imaginary; } // Declare which operator to overload (+), // the types that can be added (two Complex objects), // and the return type (Complex): public static Complex operator +(Complex c1, Complex c2) { return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); } // Override the ToString() method to display a complex number in the traditional format: public override string ToString() { return (System.String.Format("{0} + {1}i", real, imaginary)); } } class TestComplex { static void Main() { Complex num1 = new Complex(2, 3); Complex num2 = new Complex(3, 4); // Add two Complex objects through the overloaded plus operator: Complex sum = num1 + num2; // Print the numbers and the sum using the overriden ToString method: System.Console.WriteLine("First complex number: {0}",
Visual C# Consolidado
371
num1); System.Console.WriteLine("Second complex number: {0}", num2); System.Console.WriteLine("The sum of the two numbers: {0}", sum); } }
Sada
First complex number: 2 + 3i Second complex number: 3 + 4i The sum of the two numbers: 5 + 7i
COMO: Usar interoperabilidade COM para verificar ortografia usando o Word (Guia de programao C#) O exemplo de cdigo a seguir ilustra como usar interoperabilidade COM para usar recursos Spellverificao do Word em seu aplicativo Visual C#. Para obter mais informaes, consulte ProofreadingErrors e Objetos Microsoft Word. Exemplo Este exemplo ilustra como usar Verificador ortogrfico do Word a partir de um aplicativo C#. Cria um novo Word.application objeto usando interoperabilidade COM. Em seguida, utiliza a ProofreadingErrors coleo em um Range objeto e localiza as palavras incorretas no intervalo. C#
using System.Reflection; using Word = Microsoft.Office.Interop.Word; namespace WordSpell { public partial class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label1; public Form1() //constructor { InitializeComponent(); } private void button1_Click(object sender, System.EventArgs e) { Word.Application app = new Word.Application(); int errors = 0; if (textBox1.Text.Length > 0) { app.Visible = false; // Setting these variables is comparable to passing null to the function. // This is necessary because the C# null cannot be passed by reference. object template = Missing.Value; object newTemplate = Missing.Value; object documentType = Missing.Value; object visible = true; Word._Document doc1 = app.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible); doc1.Words.First.InsertBefore(textBox1.Text); Word.ProofreadingErrors spellErrorsColl = doc1.SpellingErrors; errors = spellErrorsColl.Count; object optional = Missing.Value; doc1.CheckSpelling( ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional); label1.Text = errors + " errors corrected "; object first = 0; object last = doc1.Characters.Count - 1; textBox1.Text = doc1.Range(ref first, ref last).Text; } object saveChanges = false; object originalFormat = Missing.Value; object routeDocument = Missing.Value; app.Quit(ref saveChanges, ref originalFormat, ref routeDocument); } } }
Compilando o cdigo Este exemplo requer Word para ser instalado em seu sistema e dependendo da verso do Office voc tiver instalado, o Word conjunto pode ser chamado Microsoft Office 10 Biblioteca de objetos ou biblioteca de objetos 11 Word. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio.
Visual C# Consolidado
372
4.
Incluir o Word conjunto como uma referncia para o projeto. Clique com o boto direito do mouse no projeto, clique em Add Reference, clique na COM guia da caixa Add Reference de dilogo. Clique duas vezes Microsoft Office 11 Object Library, e pressione OK. Observe que as caixas de dilogo e comandos de menu voc ver podem diferir dos descritos na Ajuda dependendo do seu ativos configuraes ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para mais informaes, consulte Configuraes do Visual Studio.
Segurana Para usar interoperabilidade COM, voc deve ter permisses de segurana de usurio energia ou administrador. Para obter mais informaes, consulte Segurana do .NET Framework. COMO: Usar interoperabilidade COM para criar uma planilha do Excel (Guia de programao C#) O exemplo de cdigo a seguir ilustra como usar COM interop para criar uma Excel planilha. Para obter mais informaes sobre Excel, consulte Objetos do Microsoft Excel, e Mtodo Open Este exemplo ilustra como abrir uma planilha existente Excel no C# using Capacidade .NET Framework COM interop. O Excel conjunto usado para abrir e inserir dados em um intervalo de clulas na planilha Excel. Observao
Visual C# Consolidado
373
Voc deve ter Excel instalado em seu sistema para este cdigo seja executado corretamente. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para criar uma planilha do Excel com interoperabilidade com 1. 2. 3. 4. Criar um novo aplicativo Console C# no Visual Studio e cham-la CreateExcelWorksheet. Incluir o conjunto Excel como uma referncia para o projeto Right-Click no projeto, selecione Add Reference.: Clique na COM guia da caixa Add Reference de dilogo, e Localizar Microsoft Excel 11 Object Library. Clique duas vezes em Microsoft Excel 11 Object Library, e pressione OK. Observao Dependendo da verso do Office instalada o conjunto Excel pode ser chamado Excel 10 Object Library ou Excel 11 Object Library.. ou Excel 11 Object Library 5. Copie o cdigo a seguir e cole sobre o contedo do arquivo Program.cs. C#
using System; using System.Reflection; using Microsoft.Office.Interop.Excel; public class CreateExcelWorksheet { static void Main() { Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) { Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct."); return; } xlApp.Visible = true; Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); Worksheet ws = (Worksheet)wb.Worksheets[1]; if (ws == null) { Console.WriteLine("Worksheet could not be created. Check that your office installation and project references are correct."); } // Select the Excel cells, in the range c1 to c7 in the worksheet. Range aRange = ws.get_Range("C1", "C7"); if (aRange == null) { Console.WriteLine("Could not get a range. Check to be sure you have the correct versions of the office DLLs."); } // Fill the cells in the C1 to C7 range of the worksheet with the number 6. Object[] args = new Object[1]; args[0] = 6; aRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, aRange, args); // Change the cells in the C1 to C7 range of the worksheet to the number 8. aRange.Value2 = 8; } }
Segurana Para usar COM interop, voc deve ter administrator ou Power User permisses de segurana. Para obter mais informaes sobre segurana, consulte Segurana do .NET Framework. COMO: Usar cdigo gerenciado como um suplemento de automao para o Excel (Guia de programao C#) Com os suplementos de automao para o Excel, voc pode usar uma funo pblica de sua biblioteca COM para ser chamado como uma frmula de clula. O exemplo a seguir ilustra como
Visual C# Consolidado
374
criar um suplemento do C# para clculo de imposto de renda TAXA em uma clula em uma planilha do Excel. Automaticamente ComRegisterFunctionAttribute registra as ferramentas add-in, e no adicionais so necessrias para registrar o cdigo gerenciado como um conjunto com. Para obter informaes adicionais, consulte Viso geral sobre de interoperabilidade (guia de programao C#). Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Calcular imposto de renda Uma tabela de imposto tpica permite para calcular o imposto fornecido receita anual de uma pessoa. Por exemplo, a seguir mostra uma tabela de imposto hipottico para indivduos. Uma tabela imposto exemplo 1. 2. 3. 4. 5. 6. Se renda em zero dlares e em $7,000, o imposto 10 por cento da quantidade. Se renda mais de r$ 100,00 7.000 e em $28,400, o imposto 15 por cento da quantidade sobre $7,000 mais $700.00. Se renda mais de r$ 100,00 28,400 e em $68,800, o imposto 25 por cento da quantidade sobre $28,400 mais 3,910.00. Se renda mais de r$ 100,00 68,800 e em $143,500, o imposto 28 por cento da quantidade sobre $68,800 mais $14,010.00. Se renda mais de r$ 100,00 143,500 e em $311,950, o imposto 33 por cento da quantidade sobre $143,500 mais $34,926.00. Se renda for sobre $311,950, o imposto ser 35 por cento da quantidade sobre $311,950 mais $90,514.50. Criar um novo projeto Visual C# Class Library chamado ExcelAddIn. Na janela Propriedades do projeto, abaixo Configuration Properties, Build, na caixa suspensa rotuladas Register for COM Interop selecione True. Configurao do projeto do Visual Studio da compilao dessa propriedade registra automaticamente seu conjunto para interoperabilidade COM. Cole o cdigo a seguir para o arquivo de classe. C#
using System.Runtime.InteropServices; namespace TaxTables { [ClassInterface(ClassInterfaceType.AutoDual)] public class TaxTables { public static double Tax(double income) { if (income > 0 && income <= 7000) {return (.10 * income);} if (income > 7000 && income <= 28400) {return 700.00 + (.15 * (income - 7000));} if (income > 28400 && income <= 68800) {return 3910.00 + (.25 * (income - 28400));} if (income > 68800 && income <= 143500) {return 14010.00 + (.28 * (income - 68800));} if (income > 143500 && income <= 311950) {return 34926.00 + (.33 * (income - 143500));} if (income > 311950) {return 90514.50 + (.35 * (income 311950));} return 0; } [ComRegisterFunctionAttribute] public static void RegisterFunction(System.Type t) { Microsoft.Win32.Registry.ClassesRoot.CreateSubKey ("CLSID\\{"
Criar um suplemento de automao para Excel usando o Visual Studio e cdigo gerenciado 1. 2.
3.
Visual C# Consolidado
375
+ t.GUID.ToString().ToUpper() + "}\\Programmable"); } [ComUnregisterFunctionAttribute] public static void UnregisterFunction(System.Type t) { Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey ("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable"); } } }
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
4.
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(); }
Visual C# Consolidado
384
_queue.Dequeue(); } count++; } Console.WriteLine("Consumer Thread: consumed {0} items", count); } private Queue<int> _queue; private SyncEvents _syncEvents; } public class ThreadSyncSample { private static void ShowQueueContents(Queue<int> q) { lock (((ICollection)q).SyncRoot) { foreach (int item in q) { Console.Write("{0} ", item); } } Console.WriteLine(); } static void Main() { Queue<int> queue = new Queue<int>(); SyncEvents syncEvents = new SyncEvents(); Console.WriteLine("Configuring worker threads..."); Producer producer = new Producer(queue, syncEvents); Consumer consumer = new Consumer(queue, syncEvents); Thread producerThread = new Thread(producer.ThreadRun); Thread consumerThread = new Thread(consumer.ThreadRun); Console.WriteLine("Launching producer and consumer threads..."); producerThread.Start(); consumerThread.Start(); for (int i=0; i<4; i++) { Thread.Sleep(2500); ShowQueueContents(queue); } Console.WriteLine("Signaling threads to terminate..."); syncEvents.ExitThreadEvent.Set(); producerThread.Join(); consumerThread.Join(); } }
Sada de exemplo
Configuring worker threads... Launching producer and consumer threads... 22 92 64 70 13 59 9 2 43 52 91 98 50 96 46 22 40 94 24 87 79 54 5 39 21 29 77 77 1 68 69 81 4 75 43 70 87 72 59 0 69 98 54 92 16 84 61 30 45 50 17 86 16 59 20 73 43 21 38 46 84 59 11 87 77 5 53 65 7 16 66 26 79 74 26 37 56 92 Signalling threads to terminate... Consumer Thread: consumed 1053771 items Producer thread: produced 1053791 items
COMO: Usar um pool de threads (Guia de programao C#) A pool de segmentos uma coleo de segmentos que podem ser usados para executar um nmero de tarefas em segundo plano. (Consulte Usando Threading Para obter informaes detalhadas.) Isso deixa o segmento primrio livre para executar outras tarefas de forma assncrona. Pools segmento geralmente so empregados em aplicativos de servidor. Cada solicitao de entrada atribuda a um segmento do pool do segmento, para a solicitao pode ser processada de forma assncrona, sem atrasar o processamento de solicitaes subseqentes amarrando backup o segmento primrio ou. Depois que um segmento no pool conclui a tarefa, ele retornado para uma fila de segmentos de espera, onde ele pode ser reutilizado. Essa reutilizao permite que aplicativos para evitar o custo de criar um novo segmento para cada tarefa. Pools segmento normalmente ter um nmero mximo de segmentos. Se estiver ocupados, todos os segmentos tarefas adicionais so colocadas na fila at que eles podem ser atendidos medida segmentos se tornam disponveis. Voc pode implementar seu prprio pool do segmento, mas ele mais fcil de usar o pool de segmentos fornecido pelo .NET Framework por meio da ThreadPool classe. O exemplo a seguir usa o pool de segmentos do .NET Framework para calcular o Fibonacci resultado de dez nmeros entre 20 e 40. Cada Fibonacci resultado representado pela classe Fibonacci, que fornece um mtodo chamado ThreadPoolCallback que executa o clculo. Um objeto que representa cada valor Fibonacci criado e passado para QueueUserWorkItem o ThreadPoolCallback mtodo que atribui um segmento disponvel no pool para executar o mtodo. Como cada Fibonacci objeto dado um valor semi-Random para calcular, e como ser cada um dos segmentos dez ser competindo de Tempo processador, no h um meio para ser instrudos com antecedncia quanto tempo levar para todos os resultados dez deve ser calculado. por isso que cada Fibonacci objeto passado uma instncia da classe ManualResetEvent durante a
Visual C# Consolidado
385
construo. Cada objeto sinaliza o objeto de evento fornecido quando seu clculo estiver concludo, que permite o segmento primrio para execuo de bloco com WaitAll at que todos os objetos dez Fibonacci ter calculado um resultado. O Main mtodo exibir cada Fibonacci resultado. Exemplo C#
using System; using System.Threading; public class Fibonacci { public Fibonacci(int n, ManualResetEvent doneEvent) { _n = n; _doneEvent = doneEvent; } // Wrapper method for use with thread pool. public void ThreadPoolCallback(Object threadContext) { int threadIndex = (int)threadContext; Console.WriteLine("thread {0} started...", threadIndex); _fibOfN = Calculate(_n); Console.WriteLine("thread {0} result calculated...", threadIndex); _doneEvent.Set(); } // Recursive method that calculates the Nth Fibonacci number. public int Calculate(int n) { if (n <= 1) { return n; } return Calculate(n - 1) + Calculate(n - 2); } public int N { get { return _n; } } private int _n; public int FibOfN { get { return _fibOfN; } } private int _fibOfN; private ManualResetEvent _doneEvent; } public class ThreadPoolExample { static void Main() { const int FibonacciCalculations = 10; // One event is used for each Fibonacci object ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations]; Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations]; Random r = new Random(); // Configure and launch threads using ThreadPool: Console.WriteLine("launching {0} tasks...", FibonacciCalculations); for (int i = 0; i < FibonacciCalculations; i++) { doneEvents[i] = new ManualResetEvent(false); Fibonacci f = new Fibonacci(r.Next(20,40), doneEvents[i]); fibArray[i] = f; ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i); } // Wait for all threads in pool to calculation... WaitHandle.WaitAll(doneEvents); Console.WriteLine("All calculations are complete."); // Display the results... for (int i= 0; i<FibonacciCalculations; i++) { Fibonacci f = fibArray[i]; Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN); } } }
Sada de exemplo
launching 10 tasks... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... all calculations complete Fibonacci(22) = 17711 Fibonacci(25) = 75025 Fibonacci(32) = 2178309 Fibonacci(36) = 14930352 Fibonacci(32) = 2178309 Fibonacci(26) = 121393 Fibonacci(35) = 9227465 Fibonacci(23) = 28657 Fibonacci(39) = 63245986 Fibonacci(22) = 17711
COMO: Pesquisar em seqncias de caracteres utilizando expresses regulares (Guia de programao C#) A System.Text.RegularExpressions.Regex classe pode ser usada para procurar seqncias. Essas pesquisas podem variar em complexidade de muito simples a fazer uso total de expresses regulares. A seguir so dois exemplos de seqncia pesquisar usando a Regex classe. Para obter mais informaes, consulte Expresses regulares .NET Framework. Exemplo O cdigo a seguir um aplicativo de console que realiza uma pesquisa simples maisculas de minsculas das seqncias de caracteres em uma matriz. O mtodo System.Text.RegularExpressions.Regex.IsMatch(System.String,System.String,System.Text.Regul arExpressions.RegexOptions) esttico executa a pesquisa fornecida seqncia para pesquisar e uma seqncia contendo o padro de pesquisa. Nesse caso, um argumento terceiro usado para indicar que caso deve ser ignorado. Para obter mais informaes, consulte System.Text.RegularExpressions.RegexOptions.
Visual C# Consolidado
386
C#
class TestRegularExpressions { static void Main() { string[] sentences = { "cow over the moon", "Betsy the Cow", "cowering in the corner", "no match here" }; string sPattern = "cow"; foreach (string s in sentences) { System.Console.Write("{0,24}", s); if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { System.Console.WriteLine(" (match for '{0}' found)", sPattern); } else { System.Console.WriteLine(); } } } }
Sada
cow over the moon (match for 'cow' found) Betsy the Cow (match for 'cow' found) cowering in the corner (match for 'cow' found) no match here
O cdigo a seguir um aplicativo de console que usa expresses regulares para validar o formato da cada seqncia em uma matriz. A validao requer que cada seqncia assumem a forma de um nmero de telefone no qual trs grupos de dgitos so separados por hfen, os primeiros dois grupos conter trs dgitos, e o terceiro grupo contm quatro dgitos. Isso feito com a expresso ^\\d{3}-\\d{3}-\\d{4}$ regular. Para obter mais informaes, consulte Elementos de idioma de expresses regulares. C#
class TestRegularExpressionValidation { static void Main() { string[] numbers = { "123-456-7890", "444234-22450", "690-203-6578", "146-893-232", "146-839-2322", "4007-295-1111", "407-295-1111", "407-25555", }; string sPattern = "^\\d{3}-\\d{3}-\\d{4}$"; foreach (string s in numbers) { System.Console.Write("{0,14}", s); if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern)) { System.Console.WriteLine(" - valid"); } else { System.Console.WriteLine(" - invalid"); } } } }
Sada
123-456-7890 - valid 444-234-22450 - invalid 690-203-6578 - valid 146-893-232 - invalid 146-839-2322 valid 4007-295-1111 - invalid 407-295-1111 - valid 407-2-5555 - invalid
COMO: Unir vrias seqncias de caracteres (Guia de programao C#) H duas maneiras para ingressar em vrias seqncias: usando o + operador que a String classe overloads, e usando a StringBuilder classe. O + operador fcil de usar e torna para intuitivo cdigo, mas ele funciona em seqncia; uma nova seqncia criada para cada uso do operador, portanto encadeamento vrios operadores juntos ineficiente. Por exemplo: C#
string two = "two"; string str = "one " + two + " three"; System.Console.WriteLine(str);
Embora quatro seqncias aparecem no cdigo, a trs seqncias sendo associados e a seqncia de caracteres que contm todos os trs, final cinco seqncias so criadas no total porque as primeiras duas seqncias esto associadas primeiro, criar uma seqncia contendo " Um dois ". O terceiro acrescentado separadamente, formando a seqncia de caracteres armazenada no str final. Como alternativa, a StringBuilder classe pode ser usada para adicionar cada seqncia a um objeto que cria a seqncia final em uma etapa. Essa estratgia demonstrada no exemplo a seguir. Exemplo
Visual C# Consolidado
387
O cdigo a seguir usa o mtodo acrscimo da classe StringBuilder Para ingressar em trs seqncias sem o efeito do + operador Chaining. C#
class StringBuilderTest { static void Main() { string two = "two"; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("one "); sb.Append(two); sb.Append(" three"); System.Console.WriteLine(sb.ToString()); string str = sb.ToString(); System.Console.WriteLine(str); } }
COMO: Pesquisar em seqncias de caracteres utilizando mtodos de String (Guia de programao C#) O Seqncia Tipo, que um alias para a System.String classe, fornece um nmero de mtodos til para pesquisar o contedo de uma seqncia. O exemplo a seguir utiliza e EndsWith Mtodos., StartsWith a IndexOf, LastIndexOf Exemplo C#
class StringSearch { static void Main() { string str = "A silly sentence used for silly purposes."; System.Console.WriteLine("'{0}'",str); bool test1 = str.StartsWith("a silly"); System.Console.WriteLine("starts with 'a silly'? {0}", test1); bool test2 = str.StartsWith("a silly", System.StringComparison.OrdinalIgnoreCase); System.Console.WriteLine("starts with 'a silly'? {0} (ignoring case)", test2); bool test3 = str.EndsWith("."); System.Console.WriteLine("ends with '.'? {0}", test3); int first = str.IndexOf("silly"); int last = str.LastIndexOf("silly"); string str2 = str.Substring(first, last - first); System.Console.WriteLine("between two 'silly' words: '{0}'", str2); } }
Sada
'A silly sentence used for silly purposes.' starts with 'a silly'? False starts with 'a silly'? True (ignore case) ends with '.'? True between two 'silly' words: 'silly sentence used for '
COMO: Analisar seqncias usando o mtodo Split (Guia de programao C#) O exemplo de cdigo a seguir demonstra como uma seqncia pode ser analisado usando o System.String.Split mtodo. Esse mtodo funciona, retornando uma matriz de seqncias, onde cada elemento uma palavra. Como entrada, Split leva uma matriz de caracteres que indicam quais caracteres so a ser usado como delimitadores. Neste exemplo, espaos, vrgulas, pontos, dois-pontos, e guias so usados. Uma matriz contendo esses delimitadores passado para Split, e cada palavra na frase ser exibida separadamente usando a matriz de seqncias de caracteres resultante. Exemplo C#
class TestStringSplit { static void Main() { char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string text = "one\ttwo three:four,five six seven"; System.Console.WriteLine("Original text: '{0}'", text); string[] words = text.Split(delimiterChars); System.Console.WriteLine("{0} words in text:", words.Length); foreach (string s in words) { System.Console.WriteLine(s); } } }
Sada
Original text: 'one two three:four,five six seven' 7 words in text: one two three four five six seven
COMO: Criar uma unio C/C++ usando atributos (Guia de programao C#)
Visual C# Consolidado
388
Usando atributos Voc pode personalizar como estruturas so dispostas na memria. Por exemplo, voc pode criar o que conhecido como uma unio em C/C usando e FieldOffset Atributos. o StructLayout(LayoutKind.Explicit) Exemplo Nesse segmento de cdigo, todos os campos de TestUnion incio no mesmo local na memria. C#
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] struct TestUnion { [System.Runtime.InteropServices.FieldOffset(0)] public int i; [System.Runtime.InteropServices.FieldOffset(0)] public double d; [System.Runtime.InteropServices.FieldOffset(0)] public char c; [System.Runtime.InteropServices.FieldOffset(0)] public byte b; }
A seguir outro exemplo onde incio campos em diferente explicitamente configurar locais. C#
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] struct TestExplicit { [System.Runtime.InteropServices.FieldOffset(0)] public long lg; [System.Runtime.InteropServices.FieldOffset(0)] public int i1; [System.Runtime.InteropServices.FieldOffset(4)] public int i2; [System.Runtime.InteropServices.FieldOffset(8)] public double d; [System.Runtime.InteropServices.FieldOffset(12)] public char c; [System.Runtime.InteropServices.FieldOffset(14)] public byte b; }
Os dois int campos, i1 e i2, compartilhar os mesmos locais como lg de memria. Esse tipo de controle sobre layout struct til quando usando invocao de plataforma. COMO: Criar e usar DLLs em C# (Guia de programao C#) Uma biblioteca de vnculo dinmica (DLL) est vinculada ao seu programa em tempo de execuo. Para demonstrar Criando e usando uma DLL, considere o seguinte cenrio:
MathLibrary.DLL o arquivo de biblioteca que contm os mtodos para ser chamado em tempo de execuo. Neste exemplo, a DLL contm dois mtodos, Add e Multiply. Add.cs o arquivo de origem que contm o mtodo Add(long i, long j). Ela retorna a soma de seus parmetros. A classe AddClass que contm o mtodo Add um membro do espao para nome UtilityMethods. Mult.cs o cdigo fonte que contm o mtodo Multiply(long x, long y). Ele retorna o produto de seus parmetros. A classe MultiplyClass que contm o mtodo Multiply tambm um membro do espao para nome UtilityMethods. TestCode.cs o arquivo que contm o Main mtodo. Ele usa os mtodos no arquivo DLL para
Visual C# Consolidado
389
C#
// File: Mult.cs namespace UtilityMethods { public class MultiplyClass { public static long Multiply(long x, long y) { return (x * y); } } }
C#
// File: TestCode.cs using UtilityMethods; class TestCode { static void Main(string[] args) { System.Console.WriteLine("Calling methods from MathLibrary.DLL:"); if (args.Length != 2) { System.Console.WriteLine("Usage: TestCode <num1> <num2>"); return; } long num1 = long.Parse(args[0]); long num2 = long.Parse(args[1]); long sum = AddClass.Add(num1, num2); long product = MultiplyClass.Multiply(num1, num2); System.Console.WriteLine("{0} + {1} = {2}", num1, num2, sum); System.Console.WriteLine("{0} * {1} = {2}", num1, num2, product); } }
Este arquivo contm o algoritmo que usa os mtodos DLL, Add e Multiply. Comear com analisar os argumentos inseridos da linha de comando, num1 e num2. Ele calcula a soma, usando o Add mtodo na classe AddClass, e o produto usando o Multiply mtodo na classe MultiplyClass. Observe que a using diretiva no incio do arquivo permite-lhe usar a classe no qualificado nomes para consultar os mtodos DLL ao tempo de compilao, da seguinte maneira: C#
MultiplyClass.Multiply(num1, num2);
Caso contrrio, voc ter para usar os nomes totalmente qualificados, da seguinte maneira: C#
UtilityMethods.MultiplyClass.Multiply(num1, num2);
Execuo Para executar o programa, digite o nome do arquivo exe, seguido por dois nmeros, da seguinte maneira:
TestCode 1234 5678
Sada
Calling methods from MathLibrary.DLL: 1234 + 5678 = 6912 1234 * 5678 = 7006652
Compilando o cdigo Para criar o arquivo MathLibrary.DLL, compilar os dois arquivos Add.cs e Mult.cs Usando a linha de comando a seguir:
csc /target:library /out:MathLibrary.DLL Add.cs Mult.cs
A /Target:Library opo de compilador informa o compilador para dar sada uma DLL em vez de um arquivo EXE. A / Fora opo de compilador seguida por um nome de arquivo utilizada para especificar o nome do arquivo DLL Caso contrrio, o compilador usa o primeiro arquivo (Add.cs.) como o nome da DLL Para criar o arquivo executvel, TestCode.exe, use a seguinte linha de comando:
csc /out:TestCode.exe /reference:MathLibrary.DLL TestCode.cs
Visual C# Consolidado
390
A /out opo de compilador informa o compilador para produzir sada de um arquivo EXE e especifica o nome do arquivo de sada). (TestCode.exe Esta opo de compilador opcional. A /Reference opo de compilador Especifica o arquivo DLL ou arquivos que usa este programa. COMO: Determinar se um arquivo um mdulo (assembly) (Guia de programao C#) Um arquivo um conjunto se e somente se ele gerenciada, e contm uma entrada do conjunto nos seus metadados. Para obter mais informaes sobre conjuntos e metadados, consulte o tpico Manifesto do Assembly. Como determinar se um arquivo um conjunto manualmente 1. 2. 3. Iniciar o Disassembler MSIL (Ildasm.exe). Carregar o arquivo que deseja testar. Se ILDASM, arquivo relatrios no que o arquivo um executvel porttil (PE), ele um conjunto no. Para obter mais informaes, consulte o tpico Como Visualizar o Contedo de um Assembly. Chame o GetAssemblyName mtodo, passando o caminho de arquivo completo e nome do arquivo que voc est testando. Se uma BadImageFormatException exceo acionada, o arquivo um conjunto no.
Exemplo Este exemplo testa uma DLL para verificar se ele um conjunto. C#
class TestAssembly { static void Main() { try { System.Reflection.AssemblyName testAssembly = System.Reflection.AssemblyName.GetAssemblyName(@"C:\WINDOWS\system\avicap.dll"); System.Console.WriteLine("Yes, the file is an Assembly."); } catch (System.IO.FileNotFoundException e) { System.Console.WriteLine("The file cannot be found."); } catch (System.BadImageFormatException e) { System.Console.WriteLine("The file is not an Assembly."); } catch (System.IO.FileLoadException e) { System.Console.WriteLine("The Assembly has already been loaded."); } } }
O GetAssemblyName mtodo carrega o arquivo de teste, e depois libera ele depois que as informaes leitura. Sada
The file is not an Assembly.
COMO: Carregar e descarregar mdulos (assemblies) (Guia de programao C#) As montagens referenciadas por seu programa automaticamente ser carregadas ao tempo de criao, mas tambm possvel carregar conjuntos especficos para o domnio do aplicativo atual em tempo de execuo. Para obter mais informaes, consulte Domnios de aplicativo. No h um meio para descarregar um conjunto individual sem descarregar todos os domnios de aplicativos que contm ele. Mesmo se o conjunto sai do escopo, o arquivo de montagem real permanecer carregado at que todos os domnios de aplicativos que contm ele sejam descarregados.
Visual C# Consolidado
391
Se voc desejar descarregar alguns conjuntos mas no outros, considere criar um novo domnio do aplicativo executar o cdigo dentro desse domnio, e ento descarregar desse domnio do aplicativo. Para obter mais informaes, consulte Como executar cdigo em outro domnio de aplicativo:. Para carregar um conjunto em um domnio de aplicativo
Use uma das vrias a carregar mtodos contidos nas classes AppDomain e System.Reflection. Para obter mais informaes, consulte Carregar conjuntos em um domnio de aplicativo. No h um meio para descarregar um conjunto individual sem descarregar todos os domnios de aplicativos que contm ele. Use o Unload mtodo do AppDomain para descarregar os domnios de aplicativo. Para obter mais informaes, consulte Descarregar um domnio de aplicativo.
COMO: Compartilhar um mdulo (assembly) com outros aplicativos (Guia de programao C#) Conjuntos podem ser privado nem compartilhada: Por padro, simples maioria dos programas C# consistir de um conjunto particular porque eles no se destinam a ser usado por outros aplicativos. Para compartilhar um conjunto com outros aplicativos, ele deve ser colocado no (GAC Cache global de assembly ). Compartilhar um conjunto 1. 2. 3. 4. 5. Criar seu conjunto. Para obter mais informaes, consulte Criando conjuntos. Atribuir um nome de alta segurana a seu conjunto. Para obter mais informaes, consulte COMO: Assinar uma Assembly com Nome Forte. Atribuir informaes de verso a seu conjunto. Para obter mais informaes, consulte Versionamento de assembly. Incluir seu conjunto para o cache assembly global. Para obter mais informaes, consulte Como Instalar um Assembly na Cache Global de Assemblies. Acessar os tipos contidos no conjunto dos outros aplicativos. Para obter mais informaes, consulte Como Referenciar um Assembly de Nome Forte.
Visual C# Consolidado
392
Considere arquivo a seguir, que cria um conjunto que consiste em um espao para nome nico e duas classes. Suponha que este conjunto de mdulos (assembly) tenha sido criado, e armazenada no disco C com o nome HelloWorldRemote.exe. C#
// This namespace contains code to be called. namespace HelloWorldRemote { public class RemoteObject : System.MarshalByRefObject { public RemoteObject() { System.Console.WriteLine("Hello, World! (RemoteObject Constructor)"); } } class Program { static void Main() { System.Console.WriteLine("Hello, World! (Main method)"); } } }
Para acessar o cdigo de outro aplicativo, voc pode tanto carregar o conjunto para o domnio de aplicativo atual ou criar um novo domnio de aplicativo e carregar o conjunto para ela Se voc carregar o conjunto no domnio de aplicativo atual com Assembly.LoadFrom, voc pode usar Assembly.CreateInstance para criar uma instncia da classe RemoteObject, que faz o Construtor de objeto a ser executado C#
static void Main() { // Load the assembly into the current appdomain: System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(@"c:\HelloWorldRemote.exe"); // Instantiate RemoteObject: newAssembly.CreateInstance("HelloWorldRemote.RemoteObject"); }
Ao carregar o conjunto em um domnio de aplicativos separados, usar AppDomain.ExecuteAssembly para acessar o ponto de entrada padro ou AppDomain.CreateInstance Para criar uma instncia da classe RemoteObject. Criar a instncia faz o construtor para ser executado. C#
static void Main() { System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain"); // Load the assembly and call the default entry point: NewAppDomain.ExecuteAssembly(@"c:\HelloWorldRemote.exe"); // Create an instance of RemoteObject: NewAppDomain.CreateInstanceFrom(@"c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObject"); }
Se voc no faa desejar carregar o conjunto programaticamente, use Add Reference de para especificar o conjunto HelloWorldRemote.exe. o Solution Explorer Em seguida, adicionar uma using HelloWorldRemote; diretiva para o Usando Bloco de seu aplicativo, e usar o RemoteObject tipo no seu programa para declarar uma instncia do objeto RemoteObject, como este: C#
static void Main() { // This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference: HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject(); }
COMO: Criar e usar um domnio de aplicao (Guia de programao C#) Domnios de aplicativo fornecem um mtodo de isolar o cdigo para fins de segurana e desempenho. Para obter mais informaes, consulte Domnios de aplicativo (guia de programao C#). Usando um domnio de aplicativo
Visual C# Consolidado
393
1.
Criar o domnio de aplicativo. O host Runtime de idioma comum cria um domnio de aplicativo para automaticamente seu aplicativo. Para informaes, consulte o tpico Como: Criar um domnio de aplicativo. Configure o domnio de aplicativo. Para obter mais informaes, consulte Como Configurar um Domnio de Aplicativo. Carregar um conjunto no domnio de aplicativo. Para obter mais informaes, consulte Como Carregar Assemblies em um Domnio de Aplicativo. Acessar o Contedo do outro conjunto. Para obter mais informaes, consulte Executar cdigo em outro domnio de aplicao (Guia de programao C#). Descarregar o domnio do aplicativo. Para obter mais informaes, consulte Como: Descarregar um domnio de aplicativo.
2. 3. 4. 5.
Exemplos do Visual C#
Voc pode acessar cdigo de exemplo, procurando resumos de exemplo nesta seo. Cada abstrato contm um link para abrir ou copiar o exemplo na arquivos. Alm disso, o SDK do .NET Framework inclui tecnologia e aplicativo Exemplos e tutoriais QuickStart que demonstram recursos .NET Framework e cdigo Visual C#. Os tutoriais QuickStart so a maneira mais rpida para entender o que a tecnologia .NET Framework oferece desenvolvedores lder-borda. Os QuickStarts so uma srie de exemplos e suporte documentao projetadas para rapidamente acquaint voc com a sintaxe, arquitetura, e poder do Visual Studio e o .NET Framework. Do ASP.NET Os tutoriais QuickStart inclui exemplos na e aplicativos Windows Forms, alm de muitos aplicativos instruo que abrangem os recursos da tecnologia .NET Framework mais atraentes. Para acessar o QuickStarts, clique em Start, aponte para Programs, aponte para Microsoft .NET Framework SDK v2.0, e clique em QuickStart Tutorials. Uma pgina da Web do aplicativo " tutoriais QuickStart SDK Microsoft .NET Framework " exibida. Para executar o QuickStarts, siga as instrues na pgina, que configura o banco de dados amostras e conclui a instalao. Para obter mais informaes, consulte Amostras e QuickStarts. Nesta seo Exemplos de introduo Annimo exemplo representantes Exemplo matrizes Coleo exemplo classes Exemplo generics (C#) Demonstra o uso de representantes para reduzir a complexidade de aplicativos sem nome. Mostra como usar matrizes. Mostra como fazer classes coleo Generic no-que podem ser usados com a foreach instruo. Mostra como fazer classes a coleo genrica que podem ser usados com a foreach instruo.
Exemplo de parmetros Demonstra simples processamento de linha de comando e matriz da linha de comando indexao. Exemplo dos Mtodos condicional Demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido.
Exemplo representantes Mostra como representantes so declaradas, mapeado, e combinados. Exemplo eventos Mostra como usar eventos em C#.
Visual C# Consolidado
394
Exemplo de implementao de interface explcita Exemplo World de saudao Exemplo indexadores Indexado exemplo propriedades
Um aplicativo hello world. Mostra como usar notao de matriz para acessar um objeto. Mostra como a implementar uma classe que usa propriedades indexadas. Propriedades indexadas permitem que voc para usar uma classe que representa uma coleo de vrios tipos diferentes de itens semelhantes matriz-. Mostra como propriedades so declaradas e usados; tambm demonstra propriedades abstratas. Mostra como usar structs em C#. Mostra como definido pelo usurio classes poder sobrecarregar operadores. Mostra como definir converses de e para tipos definidos pelo usurio. Do override demonstra verso em C# atravs do uso de e new palavras-chave. Demonstra a palavra-chave rendimento para filtrar itens em uma coleo.
Exemplo propriedades Exemplo Structs Exemplo Overloading do operador Exemplo Conversions definidas pelo usurio Exemplo de verso Produzir exemplo
Exemplos intermedirio e Avanado Exemplo atributos Exemplo parte 1 Interop COM Exemplo parte 2 Interop COM Exemplo bibliotecas Mostra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Mostra como usar C# para interoperar com objetos COM. Mostra como um servidor use um C# com um cliente com C++. Mostra como usar opes do compilador para criar uma DLL de vrios arquivos de origem; alm disso, como usar a biblioteca em outros programas. Demonstra tipos de valores que podem ser definidos como nulo. Demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados.
Exemplo tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios arquivos cdigo fonte-C#. Plataforma Invoke exemplo Exemplo de segurana Mostra como chamar exportadas funes DLL do C#. Discute a segurana do .NET Framework e mostra duas maneiras de modificar as permisses de segurana em C#: Usando classes de permisso e atributos de permisso.
Visual C# Consolidado
395
Demonstra vrias atividades do segmento, como criando e executando um segmento, sincronizando segmentos, interagir entre segmentos, e usando um pool de segmentos. Mostra como usar ponteiros. Mostra como a documentar cdigo usando XML.
Visual C# Consolidado
396
Visual C# Consolidado
397
Como Adicionar ou Remover Entradas da Lista de Controle de Acesso Adiciona ou remove entradas da Lista de Controle de Acesso (ACL) para aumentar a segurana. Seqncias de Caracteres Criando Novas Seqncias de Caracteres Como criar uma nova seqncia de caracteres. Aparando e Removendo Caracteres Como remover caracteres do incio ou do final de uma seqncia de caracteres. Preenchendo Seqncias de Caracteres Como adicionar tabulaes ou espaos ao incio ou ao final de seqncias de caracteres. Comparando Seqncias de Caracteres Como verificar a igualdade de duas seqncias de caracteres. Alterando a Caixa Como alterar letras em maisculo para letras em minsculo e visse-versa. Usando a Classe StringBuilder Tcnicas eficientes de manipulao de seqncias de caracteres. Como Executar Manipulaes sobre Seqncia de Caracteres Usando Operaes Bsicas Como dividir seqncias, acrescentar uma seqncia a outra e mais. Como Converter Tipos de Dados Usando System.Convert Contm um exemplo que usa a classe Convert para transformar um valor string em um valor booleano. Como Remover Caracteres Invlido de uma Seqncia de Caracteres Contm um exemplo que usa o mtodo esttico Regex.Replace para remover caracteres invlidos de uma seqncia de caracteres. Como Verificar se Seqncias de Caracteres Esto em um Formato de Email Vlido Contm um exemplo que usa o mtodo esttico Regex.IsMatch para verificar se uma seqncias de caracteres est em um formato de email vlido. Colees Colees e Estruturas de Dados Viso geral das classes de coleo do .NET Framework.
Visual C# Consolidado
398
Selecionando uma Classe de Coleo Como escolher que tipo de coleo usar. Quando Usar Colees Genricas Explica as vantagens de classes de coleo genricas sobre classes coleo nogenricas. System.Collections.Generic Pgina de portal das classes da coleo genricas. List Fornece exemplos de cdigo mostrando como adicionar e remover itens de uma coleo List<T>. SortedDictionary Fornece exemplos de cdigo mostrando como adicionar e remover pares chave/valor de uma coleo SortedDictionary<K,V>. Excees Como Usar Excees Especficas em um Bloco Catch Contm um exemplo que usa um bloco try/catch para captura uma InvalidCastException. Como Usar o Bloco Try/Catch para Capturar Excees Contm um exemplo que usa um bloco try/catch para capturar uma possvel exceo. Como Criar Excees Definida pelo Usurio Contm um exemplo onde uma nova classe de exceo, EmployeeListNotFoundException, derivada de Exception. Como Usar Blocos Finally Contm um exemplo que usa um bloco try/catch para capturar uma exceo ArgumentOutOfRangeException. Como Lanar Excees Explicitamente Contm um exemplo que usa um bloco try/catch para detectar uma possvel exceo FileNotFoundException. Eventos Como Consumir Eventos em um Aplicativo do Windows Forms Contm exemplos que mostram como tratar um evento de clique boto em um Windows Form. Como Conectar Mtodos de Manipulao de Eventos a Eventos
Visual C# Consolidado
399
Contm exemplos que mostram como adicionar um mtodo que manipula um evento a um evento. Como Gerar e Consumir Eventos Contm um exemplo que usa conceitos descritos em detalhes em Eventos e Delegates e Gerando um Evento. Como Manipular Vrios Eventos Usando Propriedades de Evento Contm um exemplo que mostrar como manipular vrios eventos usando propriedades de evento. Como Implementar Eventos em sua Classe Contm procedimentos que descrevem como implementar um evento em uma classe. Depurao Consulte Depurao (Como Fazer em C#). Implantao Consulte Segurana (Como Fazer em C#). Serviced Components Como Criar um Gerenciador de Recursos de Compensao (CRM) Inclui exemplos de cdigo para mostrar como criar um Gerenciador de Recursos de Compensao Como Criar um Serviced Component Contm um procedimento que descreve como criar um novo serviced component. Como Aplicar o Atributo Description a um Assembly Mostra como aplicar o atributo DescriptionAttribute para definir a descrio de um assembly. Como Usar os Mtodos SetAbort e SetComplete Mostra como usar os mtodos estticos SetComplete e SetAbort da classe ContextUtil. Como Aplicar o Atributo ApplicationID a um Assembly Mostra como aplicar o atributo ApplicationID a um assembly. Como Criar um Objeto de Pool e Definir seus Limites de Tamanho e de Tempo Mostra como criar um objeto de pool e definir seus limites de tamanho e de tempo. Como criar um Mtodo de Web Service que Usa Transaes Automticas
Visual C# Consolidado
400
Descreve como criar um mtodo de Web Service que usa transaes automticas. Como Definir a Propriedade SoapRoot Property para um Aplicativo Mostra como definir a propriedade SoapVRoot como "MyVRoot". Como Definir o Tempo Limite da Transao Mostra como configurar o tempo limite da transao para 10 segundos. Como Definir o Nome do Aplicativo Usando o Atributo ApplicationName Mostra como fornecer o nome do aplicativo usando o atributo ApplicationName a nvel de assembly. Como Usar o Recurso BYOT (Bring Your Own Transaction - Traga sua Prpria Transao) do COM+ Contm procedimentos que mostram como uma classe derivada da classe ServicedComponent pode usar o recurso BYOT do COM+ para acessar um coordenador de transaes distribudas (DTC). Como Criar um Componente Privado Mostra como usar o atributo PrivateComponentAttribute em uma classe. Como Definir o Tipo de Ativao de um Aplicativo Mostra como definir o tipo de ativao para "server". Como Habilitar Sincronizao em Instncias de uma Classe Mostra como para habilitar sincronizao em instncias da classe TestSync. Como Usar Transaes Automticas em uma Classe do .NET Framework Descreve como preparar uma classe para participar de uma transao automtica. Como Habilitar Ativao JIT Mostra como habilitar ativao e desativao JIT dentro e fora de uma classe. Como Definir o Atributo AutoComplete em uma Classe Transaction-Aware Mostra o posicionamento do atributo AutoComplete em uma classe transaction-aware. Como Implementar um Componente Enfileirado que Exibe uma Mensagem de Forma Assncrona Demonstra como implementar um componente enfileirado que exibe uma mensagem de forma assncrona. Como Implementar Eventos Fracamente Acoplados
Visual C# Consolidado
401
Contm procedimentos que mostram como implementar uma classe de eventos e um coletor de eventos que implementam uma interface de eventos comum e mais um publisher para acionar o evento. Como Configurar a Construo de Objetos Contm um procedimento e um exemplo que descrevem como configurar a construo de objetos e definir a seqncia de inicializao padro da classe TestObjectConstruct para a seqncia "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". Assemblies e Domnios de Aplicativos Como Obter Informaes de Tipo e Membros de um Assembly Contm um exemplo que obtm informaes de tipo e membro de um assembly. Como Criar um Assembly de Arquivo nico Contm um procedimento que mostra como criar assemblies de arquivo nico usando compiladores de linha de comando. Como criar um Domnio de Aplicativo Cria um novo domnio de aplicativo, atribui o nome MyDomain e, em seguida, imprime no console o nome do domnio do host e do domnio do aplicativo filho recm-criado. Como Determinar o Nome Totalmente Qualificado de um Assembly Mostra como exibir o nome totalmente qualificado de um assembly contendo uma classe especificada para o console. Como Configurar um Domnio de Aplicativo Cria uma instncia da classe AppDomainSetup, usa essa classe para criar um novo domnio de aplicativo, escreve as informaes no console e descarrega o domnio de aplicativo. Como Visualizar o Contedo de um Assembly Contm um exemplo que comea com um programa "Hello, World " bsico e mostra como usar ILDASM.exe para desmontar o assembly Hello.exe e exibir o manifesto do assembly. Como Referenciar um Assembly de Nome Forte Cria um assembly chamado myAssembly.dll que referencia um assembly de nome forte chamado myLibAssembly.dll a partir de um mdulo de cdigo chamado myAssembly.CS. Como Descarregar um Domnio de Aplicativo Cria um novo domnio de aplicativo chamado MyDomain, imprime algumas informaes no console e, em seguida, descarrega o domnio de aplicativo. Como Remover um Assembly de Cache Global de Assemblies
Visual C# Consolidado
402
Contm um exemplo que remove um assembly chamado Hello.dll da cache global de assemblies. Como Instalar um Assembly na Cache Global de Assemblies Contm um exemplo que instala um assembly chamado Hello.dll na cache global de assemblies. Como Criar um Assembly de Mltiplos Arquivos Descreve o procedimento usado para criar um assembly de mltiplos arquivos e fornece um exemplo completo que ilustra cada uma das etapas do procedimento. Como Carregar Assemblies em um Domnio de Aplicativo Contm um exemplo que carrega um assembly no domnio de aplicativo atual e, em seguida, executa o assembly. Como Assinar um Assembly com um Nome Forte Contm um exemplo que assina o assembly MyAssembly.dll com um nome forte usando o arquivo chave sgKey.snk. Como Visualizar o Contedo da Cache Global de Assemblies Mostra como usar a ferramenta Global Assembly Cache (Gacutil.exe) para exibir o contedo da cache global de assemblies. Como Criar um par de chaves Public/Private Mostra como assinar um assembly com um nome forte e como criar um par de chaves usando a ferramenta Strong Name (Sn.exe). Interoperao Como Incorporar Bibliotecas de Tipo como Recursos Win32 em Aplicativos Baseados no .NET Mostra como incorporar uma biblioteca de tipos como um recurso Win32 em um aplicativo baseado no .NET Framework. Como Gerar Assemblies de Interoperabilidade Primrios Usando Tlbimp.exe Fornece exemplos que mostram como gerar assemblies de interoperabilidade primrios usando Tlbimp.exe. Como Criar Assemblies de Interoperabilidade Primrios Manualmente Fornece um exemplo que mostra como criar assemblies de interoperabilidade primrios manualmente. Como Gerar Assemblies de Interoperabilidade a partir de Bibliotecas de Tipo Fornece exemplos que mostram como gerar um assemblies de interoperabilidade a partir de uma biblioteca tipo.
Visual C# Consolidado
403
Como Gerar Eventos Manipulados por um Coletor COM Fornece um exemplo que mostra um servidor gerenciado como a fonte do evento e um cliente COM como o coletor do evento. Como Personalizar Wrappers Invocveis em Tempo de Execuo Mostra como personalizar wrappers invocveis em tempo de execuo modificando a fonte IDL ou modificando um assembly importado. Como Configurar Componentes Baseado em .NET para Habilitar Livre Registro Explica como configurar componentes baseados no .NET Framework para habilitar Livre Registro Como Implementar Funes CallBack Demonstra como um aplicativo gerenciado, usando invocao de plataforma, pode imprimir o valor de identificador para cada janela do computador local Como Mapear HRESULTs e Excees Contm um exemplo que mostra como criar uma nova classe de exceo chamada NoAccessException e mape-la ao HRESULT E_ACCESSDENIED. Como Editar Assemblies de Interoperabilidade Demonstra como especificar alteraes de empacotamento na Microsoft Intermediate Language (MSIL). Como Adicionar Referncias a Bibliotecas de Tipo Explica as etapas para adicionar uma referncia a uma biblioteca de tipos. Como Manipular Eventos Gerados por uma Fonte COM Inclui um exemplo que demonstrar como abrir uma janela do Internet Explorer e como amarrar eventos gerados pelo objeto InternetExplorer a manipuladores de eventos implementados em cdigo gerenciado. Como Criar Wrappers Manualmente Mostra um exemplo da interface ISATest e da classe SATest em IDL e os tipos correspondentes no cdigo fonte C#. Como Registrar Assemblies de Interoperabilidade Primrios Inclui um exemplo que mostra como registrar o assembly de interoperabilidade primrio CompanyA.UtilLib.dll. Como Empacotar Vrias Verses de Bibliotecas de Tipos Explica como empacotar mais de uma verso de uma biblioteca de tipos. Segurana
Visual C# Consolidado
404
Consulte Segurana (Como Fazer em C#). Serializao Como Desserializar um Objeto Fornece um exemplo que desserializa um objeto em um arquivo. Como Usar Ferramenta de Definio de Esquema XML para Gerar Classes e Documentos de Esquema XML Fornece procedimentos para mostrar como usar a ferramenta de definio de esquema XML para gerar classes e documentos de esquema XML. Como Especificar um Nome de Elemento Alternativo para um Fluxo XML Mostra como voc pode gerar mais de um fluxo de XML com o mesmo conjunto de classes. Como Controlar a Serializao de Classes Derivadas Fornece um exemplo que mostrar como controlar a serializao de classes derivadas. Como Serializar um Objeto como um Fluxo XML de Codificao SOAP Fornece um procedimento e um exemplo para serializar um objeto como um fluxo de XML de Codificao SOAP. Como Particionar Dados Serializados Fornece um procedimento e um exemplo para implementar particionamento do lado do servidor e processamento do lado do cliente. Como Serializar um Objeto Fornece um procedimento para serializar um objeto. Como Qualificar um Elemento XML e Nomes Atributos XML Fornece um procedimento e um exemplo para criar nomes qualificados em um documento XML. Como Substituir a Serializao SOAP XML Codificada Fornece um procedimento e um exemplo para substituir serializao de objetos como mensagens SOAP. Codificao e Localizao Como Analisar Dgitos Unicode Fornece um exemplo que usa o mtodo Decimal.Parse para analisar seqncias de caracteres de valores Unicode que especificam dgitos em scripts diferentes.
Visual C# Consolidado
405
Como Criar Culturas Personalizadas Fornece um procedimento para definir e criar um cultura personalizada. Programao Avanada Como Definir e Executar Mtodos Dinmicos Mostra como definir e executar um mtodo dinmico simples e um mtodo dinmico ligado a uma instncia de uma classe. Como Examinar e Instanciar Tipos Genricos com Reflexo Fornece procedimentos que mostram como descobrir e manipular tipos genricos. Como Definir um Mtodo genrico com Emisso de Reflexo Fornece procedimentos que mostram como definir um mtodo genrico com emisso de reflexo. Como Usar Assinatura Completa para Dar a um Assembly Dinmico um Nome Forte Demonstra o uso de assinatura completa para dar um assembly dinmico um nome forte. Como Carregar Assemblies no Contexto Somente de Reflexo Fornece um procedimento e um exemplo de cdigo para mostrar como carregar assemblies no contexto somente de reflexo. Como Definir um Tipo Genrico com Emisso de Reflexo Mostra como criar um tipo genrico simples com dois parmetros de tipo, como aplicar restries de classe, restries de interface e restries especiais aos parmetros de tipo e como criar membros que usam os parmetros de tipo de uma classe como tipos de parmetros e tipos de retorno. Explicaes Passo-a-passo do .NET Framework SDK Passo-a-passo: Adicionando Marcas Inteligentes a um Componente do Windows Forms Demonstra como adicionar marcas inteligentes usando cdigo de um controle de exemplo simples, ColorLabel, que derivado do controle padro Windows Forms Label Passo-a-passo: Alterando a Mensagem SOAP Usando Extenses SOAP Mostra como criar e executar uma extenso SOAP. Passo-a-passo: Construindo um XML Web Service Bsico Usando ASP.NET Demonstra como criar um XML Web Services bsico usando ASP.NET. Passo-a-passo: Personalizao para Dispositivos Especficos Demonstra como personalizar dispositivos especficos. Passo-a-passo: Personalizando a Gerao de Descries de Servios e Classes Proxy
Visual C# Consolidado
406
Demonstra como personalizar a gerao de descries de servios e classes proxy. Passo-a-passo: Implantando um Aplicativo ClickOnce Manualmente Descreve as etapas necessrias para criar uma implantao ClickOnce completa usando a verso de linha de comando ou grfica da ferramenta de Gerao e Edio de Manifesto (Manifest Generation and Editing - Mage). Passo-a-passo: Fazendo o Download de Assemblies por Demanda com a API de Implantao do ClickOnce Demonstra como marcar determinados assemblies em seu aplicativo como "optional" (opcional) e como fazer o download dos mesmos usando classes no namespace System.Deployment.Application quando a Common Language Runtime (clr) os requer. Passo-a-passo: Implementando um Editor de Tipos de Interface do Usurio Explica como criar seu prprio editor de tipos de interface do usurio para um tipo personalizado e como exibir a interface de edio usando um PropertyGrid. Recursos adicionais Visual Studio 2005 Developer Center Contm vrios artigos e recursos sobre o desenvolvimento de aplicativos usando o Visual Studio 2005. Este site atualizado regularmente com novos contedos. Visual C# Developer Center Contm vrios artigos e recursos sobre o desenvolvimento de aplicativos em C#. Este site atualizado regularmente com novos contedos. Microsoft .NET Framework Developer Center Contm vrios artigos e recursos sobre desenvolvimento e a depurao de aplicativos no .NET Framework. Este site atualizado regularmente com novos contedos.
Visual C# Consolidado
407
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.
Visual C# Consolidado
410
Para fornecer um ambiente de programao orientada a objetos consistente, se o cdigo objeto for armazenado e executado localmente, executado localmente mas distribudo pela Internet ou executado remotamente. Para fornecer um ambiente da execuo de cdigo que minimiza conflitos de implantao e versionamento de software. Para fornecer um ambiente da execuo que promova a execuo segura do cdigo, incluindo o cdigo criado por terceiros: desconhecidos ou semi-confiveis. Para fornecer um ambiente da execuo que elimina os problemas de desempenho dos ambientes interpretados ou com scripts. Para tornar a experincia do desenvolvedor consistente, atravs dos diversos tipos de aplicativos, como aplicativos baseados no Windows e aplicativos baseados na Web. Para criar todas as comunicaes nas indstrias padro, para garantir que cdigos baseados no .NET Framework possam se integrar a qualquer outro cdigo.
O .NET Framework tem dois componentes principais: o Common Language Runtime e a biblioteca de classes do .NET Framework. O Common Language Runtime a fundao do .NET Framework. Voc pode pensar no Runtime como um agente que dirige o cdigo no tempo de execuo, fornecendo servios principais como gerenciamento de memria, gerenciamento de segmento e arquitetura de comunicao remota, enquanto foram, tambm, a segurana de tipos estritos e outras formas de preciso de cdigo que promovem segurana e robustez. Na verdade, o conceito de gerenciamento de cdigo um princpio fundamental do Runtime. O cdigo que visa o Runtime conhecido como cdigo gerenciado, enquanto o cdigo que no visa o Runtime conhecido como cdigo no gerenciado. A biblioteca de classes, outro componente principal do .NET Framework, uma coleo de objetos orientados de tipos reutilizveis, que voc pode usar para desenvolver aplicativos, variando de linhas de comando tradicionais ou aplicativos grficos de interfaces de usurios (GUI), para aplicativos com base nas inovaes mais recentes fornecidas pelo ASP.NET, como Web Forms e Servios XML da Web. O .NET Framework pode ser hospedado por componentes no gerenciados que carregam o Common Language Runtime em seus processos, e inicializam a execuo de cdigo gerenciado. Assim, criam um ambiente de software que pode explorar os recursos gerenciados e no gerenciados. O .NET Framework no apenas fornece vrios Runtime Hosts, como tambm suporta o desenvolvimento de Runtime Hosts de terceiros. Por exemplo, o ASP.NET hospeda o Runtime para fornecer um ambiente escalonvel, do lado do servidor, para cdigo gerenciado. ASP.NET trabalha diretamente com o tempo de execuo para ativar os aplicativos ASP.NET e Servios XML da Web, ambos sero discutidos posteriormente neste tpico. Internet Explorer um exemplo de um aplicativo no gerenciado que hospeda o Runtime (na forma de uma extenso tipo MIME). Usar o Internet Explorer para hospedar o Runtime, permite que voc incorpore componentes gerenciados ou controles Windows Forms em documentos HTML. Hospedar o Runtime dessa maneira, torna possvel o gerenciamento do cdigo mvel (semelhante a controles Microsoft ActiveX), mas com melhorias significativas que somente o cdigo gerenciado pode oferecer, como execuo semi-confivel e armazenamento de arquivos isolados. A ilustrao a seguir mostra o relacionamento do Common Language Runtime e da biblioteca de classes para seus aplicativos e para o sistema geral. A ilustrao tambm mostra como o cdigo gerenciado opera dentro uma arquitetura maior. NET Framework em contexto
Visual C# Consolidado
411
As sees a seguir descrevem os recursos e componentes principais do .NET Framework com mais detalhes. Recursos do Common Language Runtime O Common Language Runtime gerencia memria, execuo de segmento, execuo do cdigo, verificao de segurana do cdigo, compilao e outros servios do sistema. Esses recursos so intrnsecos para o cdigo gerenciado, que executa no Common Language Runtime. Quanto segurana, os componentes gerenciados so concedidos variando os graus da confiana, dependendo do nmero de fatores que incluem sua origem (como a Internet, rede corporativa ou computador local). Isso significa que um componente gerenciado pode ou no ser capaz de executar operaes de acesso de arquivo, operaes de registro de acesso ou outras funes confidenciais, mesmo se ele estiver sendo usado no mesmo aplicativo ativo. O Runtime impe segurana de acesso a cdigo. Por exemplo, os usurios podem confiar que um executvel, incorporado em uma pgina da Web, pode reproduzir uma animao na tela ou tocar uma msica, mas no pode acessar seus dados pessoais, arquivos de sistema ou rede. Os recursos de segurana do Runtime ativam o legtimo Internet-deployed software para ser caracterizado, excepcionalmente, como rico. O Runtime tambm impe robustez ao cdigo ao implementar uma estrita infra-estrutura Typeand-Code-Verification chamada Common Type System (CTS). O CTS assegura que todo cdigo gerenciado autodescritivo. Os diversos compiladores de linguagem da Microsoft e de terceiros geram cdigos gerenciados que esto em conformidade com o CTS. Isso significa que cdigos gerenciados podem consumir outros tipos gerenciados e instncias, enquanto foram estritamente a fidelidade tipo e segurana. Alm disso, o ambiente gerenciado do Runtime elimina muitos problemas comuns de software. Por exemplo, o Runtime automaticamente manipula o layout de objetos e gerencia referncias a eles, liberando-os quando no esto sendo usados. Este gerenciamento automtico de memria resolve os dois erros mais comuns de aplicativos: vazamentos e referncias invlidas de memria. O Runtime tambm acelera a produtividade do desenvolvedor. Por exemplo, os programadores podem escrever aplicativos em sua linguagem de desenvolvimento de preferncia, mas aproveitar completamente o Runtime, a biblioteca de classes e componentes escritos em outras linguagens, por outros desenvolvedores. Qualquer fornecedor de compilador que escolher direcionar o Runtime pode faz-lo. Compiladores de linguagem que direcionam o .NET Framework tornam os recursos do .NET Framework disponveis para cdigos existentes, escritos nessa linguagem, facilitando bastante o processo de migrao para os aplicativos existentes. O Runtime foi criado para o software do futuro, mas tambm suporta software atuais. Interoperabilidade entre cdigos gerenciados e no gerenciados permite aos desenvolvedores continuar a usar os componentes COM e DLLs necessrios. O Runtime projetado para melhorar o desempenho. Embora o Common Language Runtime fornea vrios servios padro de Runtime, o cdigo gerenciado nunca interpretado. Um recurso chamado compilao Just-In-Time (JIT) ativa todos os cdigos gerenciados para executar na linguagem nativa da mquina do sistema, no qual ele estiver em execuo. Enquanto isso, o gerenciador de memria remove as possibilidades de memria fragmentada e aumenta a localidade-de-referncia da memria, melhorando ainda mais o desempenho. Finalmente, o Runtime pode ser hospedado por aplicativos de alto desempenho, do lado do servidor, como o Microsoft SQL Server e Servios de Informaes da Internet (IIS). Esta infra-estrutura permite que voc use cdigo gerenciado para escrever sua lgica corporativa,
Visual C# Consolidado
412
enquanto aproveita o desempenho superior dos melhores servidores de empresa que suportam runtime hosting. Biblioteca de Classes do .NET Framework A Biblioteca de classes do .NET Framework uma coleo de tipos reutilizveis que se integram rigidamente com o Common Language Runtime. A biblioteca de classes orientada a objetos, fornecendo tipos que seu prprio cdigo gerenciado pode derivar. Isso no s torna os tipos do .NET Framework fceis de usar, como tambm reduz o tempo associado ao aprendizado de novos recursos do .NET Framework. Alm disso, componentes de terceiros podem se integrar totalmente com classes do .NET Framework. Por exemplo, as classes da coleo .NET Framework implementam um conjunto de interfaces que voc pode usar para desenvolver suas prprias colees de classes. Sua coleo de classes ser perfeitamente combinada com as classes do .NET Framework. Como voc espera de uma biblioteca de classe orientada a objetos, os tipos do .NET Framework permitem que voc realize uma gama de tarefas comuns de programao, incluindo tarefas como gerenciamento de seqncia de caracteres, coleta de dados, conectividade do banco de dados e acesso a arquivos. Alm dessas tarefas comuns, a biblioteca de classes inclui tipos que oferecem suporte a uma variedade de cenrios especializados de desenvolvimento. Por exemplo, voc pode usar o .NET Framework para desenvolver os seguintes tipos de aplicativos e servios:
Aplicativos de console. Aplicativos Windows GUI (Windows Forms). Aplicativos ASP.NET. Servios XML da Web. Servios do Windows.
Por exemplo, as classes Windows Forms so um conjunto abrangente de tipos reutilizveis que simplificam vastamente o desenvolvimento do Windows GUI. Se voc criar um aplicativo de Web Form ASP.NET, voc pode usar as classes Web Forms. Desenvolvimento de Aplicativos Cliente Aplicativos cliente so os mais prximos de um estilo tradicional de um aplicativo baseado em programao Windows. Esses so os tipos de aplicativos que exibem janelas ou formulrios na rea de trabalho, permitindo a um usurio executar uma tarefa. Aplicativos cliente incluem aplicativos como processadores de texto e planilhas, bem como aplicativos de negcios personalizados, como ferramentas de entrada de dados, ferramentas de relatrios e assim por diante. Aplicativos cliente geralmente empregam janelas, menus, botes e outros elementos GUI. Eles acessam, provavelmente, recursos locais como o sistema de arquivos e perifricos, como impressoras. Outro tipo de aplicativo cliente o tradicional controle ActiveX (agora, substitudo pelo o controle gerenciado do Windows Forms) implantado atravs da Internet como pgina da Web. Este aplicativo se parece muito com outros aplicativos clientes: ele executado de forma nativa, tem acesso a recursos locais e inclui elementos grficos. No passado, os desenvolvedores criavam esses aplicativos utilizando C/C++ em conjunto com o Microsoft Foundation Classes (MFC) ou com um ambiente de desenvolvimento de aplicativos rpidos (RAD) como o Microsoft Visual Basic . O .NET Framework incorpora aspectos desses produtos existentes em um ambiente de desenvolvimento simples e consistente, que drasticamente simplifica o desenvolvimento de aplicativos cliente.
Visual C# Consolidado
413
As classes do Windows Forms contidas no .NET Framework so projetadas para serem usadas para o desenvolvimento do GUI. Facilmente, voc pode criar janelas de comando, botes, menus, barras de ferramentas e outros elementos de tela, com a flexibilidade necessria para acomodar mudanas de necessidades comerciais Por exemplo, o .NET Framework fornece propriedades simples para ajustar atributos visuais associados a formulrios. Em alguns casos o sistema operacional base no d suporte para alterao direta desses atributos, e nesse caso o .NET Framework automaticamente recria os formulrios. Essa uma das vrias maneiras na qual o .NET Framework integra a interface do desenvolvedor, tornando a codificao simples e mais consistente. Diferentemente de controle ActiveX, controles Windows Forms tm acesso semi-confivel ao computador do usurio. Isso significa que execuo binria ou nativa de cdigo pode acessar alguns dos recursos do sistema do usurio (como elementos GUI e acesso limitado ao arquivo) sem poder acessar ou comprometer outros recursos. Devido segurana de acesso ao cdigo, muitos aplicativos que antes necessitavam ser instalados no sistema de um usurio, agora podem ser implantados atravs da Web. Seus aplicativos podem implementar os recursos de um aplicativo local, enquanto so implantadas como uma pgina da Web. Desenvolvimento de aplicativos servidores Aplicativos do servidor no mundo gerenciado so implementados atravs de Runtime Hosts. Aplicativos no gerenciados hospedam o Common Language Runtime, que permite que seu cdigo gerenciado personalizado controle o comportamento do servidor. Esse modelo fornece a voc todos os recursos do Common Language Runtime e biblioteca de classes, enquanto ganha o desempenho e escalabilidade do servidor host. A ilustrao a seguir mostra um esquema de rede bsica com cdigo gerenciado em execuo, em ambientes de servidores diferentes. Servidores como o IIS e SQL Server podem executar operaes padro, enquanto a lgica do seu aplicativo executa atravs do cdigo gerenciado. Cdigo gerenciado do lado do servidor
ASP.NET o ambiente de hospedagem que permite aos desenvolvedores usar o.NET Framework para direcionar aplicativos baseados na Web. Entretanto, o ASP.NET mais do que apenas um Runtime Host; ele uma arquitetura completa para desenvolver sites e objetos InternetDistributed, usando cdigo gerenciado. Web Forms e servios XML da Web usam IIS e ASP.NET como mecanismos de publicao de aplicativos, e ambos tm uma coleo de classes que so suportadas pelo .NET Framework. Servios XML da Web, uma evoluo importante na tecnologia baseada na Web, so componentes de aplicativos distribudos, do lado do servidor, semelhante a sites comuns da Web. Entretanto, diferentemente dos aplicativos baseados na Web, componentes de servios XML da Web no tm interface de usurio, e no so direcionados para navegadores como o Internet Explorer e Netscape Navigator. Em vez disso, servios XML da Web consistem em componentes de software reutilizveis, projetados para serem consumidos por outros aplicativos, como aplicativos cliente tradicionais, aplicativos baseados na Web ou mesmo outros servios XML da Web. Como resultado, a tecnologia dos servios XML da Web est movendo, rapidamente, o desenvolvimento e implantao de aplicativos para o ambiente altamente distribudo da Internet. Se voc utilizou verses anteriores da tecnologia ASP, voc imediatamente notar os aperfeioamentos que ASP.NET e Web Forms oferecem. Por exemplo, voc pode desenvolver pginas Web Forms em qualquer linguagem que suporte o .NET Framework. Alm disso, seu cdigo no precisa mais compartilhar o mesmo arquivo com o texto HTTP (embora ele possa
Visual C# Consolidado
414
continuar fazendo isso, se voc preferir). Pginas Web Forms executam na linguagem de mquina nativa porque, como qualquer outro aplicativo gerenciado, elas aproveitam completamente o Runtime. Por outro lado, pginas ASP no gerenciadas so sempre colocadas em script e interpretadas. Pginas ASP.NET so mais rpidas, mais funcionais e mais fceis para desenvolver do que as pginas ASP no gerenciadas, porque elas interagem com o Runtime como qualquer aplicativo gerenciado. O .NET Framework tambm fornece um conjunto de classes e ferramentas para ajudar no desenvolvimento e consumo de aplicativos de servios XML da Web. Servios XML da Web so criados em padres como SOAP (um protocolo remoto de chamada de procedimento), XML (um formato de dados extensvel) e WSDL (Web Services Description Language). O .NET Framework foi construdo sobre esses padres para promover a interoperabilidade com solues noMicrosoft. Por exemplo, a ferramenta WSDL, includa com o SDK do .NET Framework, pode consultar um servio XML da Web publicado na Web, analisar sua descrio WSDL e produzir cdigo fonte C# ou Visual Basic, que o aplicativo pode usar para se tornar um cliente do servio XML da Web. O cdigo fonte pode criar classes derivadas de classes, na biblioteca de classes que trata toda a comunicao base, usando anlise SOAP e XML. Embora voc possa usar a biblioteca de classes para consumir diretamente servios XML da Web, a ferramenta WSDL e as outras ferramentas contidas no SDK facilitam os esforos de desenvolvimento com o .NET Framework. Se voc desenvolver e publicar seus prprios servios XML da Web, o .NET Framework fornecer um conjunto de classes compatveis com todos os padres de comunicao como SOAP, WSDL, e XML. Usar as classes permite que voc enfoque na lgica do seu servio, sem se preocupar com com a infra-estrutura de comunicao exigida pelo desenvolvimento de software distribudos. Finalmente, como pginas Web Forms no ambiente gerenciado, seu servio XML da Web ser executado com a velocidade de linguagem de mquina nativa, usando a comunicao escalonvel do IIS.
Visual C# Consolidado
415
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.
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
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.
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); } }
Visual C# Consolidado
420
O diagrama a seguir ilustra como esses tipos esto relacionados. Observe que instncias de tipos podem ser simplesmente tipos de valor ou tipos autodescritivos, mesmo que haja subcategorias desses tipos. Classificao de tipos
Valores e objetos Valores so representaes binrias de dados. Os tipos fornecem uma maneira de interpretar esses dados. Um tipo de valor armazenado como uma representao binria dos dados do tipo. O valor de um tipo de referncia a localidade da seqncia de bits que representam os dados do tipo. Cada valor possui um tipo exato que define por completo a representao do valor e as operaes que so definidas no valor. Valores de tipos autodescritivos so chamados objetos. Enquanto sempre possvel determinar o tipo exato de um objeto examinando seu valor, no possvel fazer o mesmo com o um tipo de valor ou tipo ponteiro. Um valor pode ter mais de um tipo. Um valor cujo tipo implementa uma interface tambm um valor do tipo da interface. Da mesma forma, um valor cujo tipo deriva de um tipo base tambm um valor desse tipo base. Tipos e Assemblys O ambiente de execuo usa assemblys para localizar e carregar tipos. O manifesto do assembly contm as informaes que o ambiente de execuo usa para resolver todas as referncias de tipo feitas dentro do escopo do assembly. Um nome de tipo no ambiente de execuo possui duas partes lgicas: o nome do assembly e o nome do tipo dentro do assembly. Dois tipos com o mesmo nome, mas em assemblys diferentes, so definidos como dois tipos distintos.
Visual C# Consolidado
421
Assemblys fornecem consistncia entre o escopo de nomes vistos pelo desenvolvedor e o escopo de nomes vistos pelo sistema em tempo de execuo. Os desenvolvedores criam tipos no contexto de um assembly. O contedo do assembly que est sendo criando por um desenvolvedor estabelece o escopo de nomes que estar disponvel em tempo de execuo. Tipos e Namespaces No ponto de vista do ambiente de execuo, um namespace apenas um conjunto de nomes de tipo. Determinadas linguagens podem ter construes que ajudam os desenvolvedores a formar grupos lgicos de tipos, mas essas construes no so usadas pelo ambiente de execuo ao vincular tipos. Assim, ambas as classes Object e String so parte do namespace System, mas o ambiente de execuo reconhece apenas os nomes completos de cada tipo que so System.Object e System.String, respectivamente Voc pode criar um nico assembly que expe tipos que parecem ter vindo de dois namespaces hierrquicos diferentes, como System.Collections e System.Windows.Forms. Voc tambm pode criar dois assemblys que exportam tipos cujos nomes contenham MyDll.MyClass. Se voc criar uma ferramenta para representar tipos em um assembly como pertencentes a um namespace hierrquico, a ferramenta deve enumerar os tipos em um assembly, ou em um grupo de assemblys, e analisar os nomes dos tipos a fim de derivar um relacionamento hierrquico.
Definies de Tipo
Voc define novos tipos a partir de tipos existentes. Tipos de valor interno, ponteiros, matrizes e delegados so definidos quando eles so usados e so referidos como tipos implcitos. Tipos podem ser aninhados; ou seja, um tipo pode ser um membro de outro tipo. Uma definio de tipo inclui:
Qualquer atributo definido no tipo. A visibilidade do tipo. O nome do tipo. O tipo base do tipo. Qualquer interface implementada pelo tipo. Definies para cada um dos membros do tipo.
Atributos Atributos fornecem metadados adicionais definidos pelo usurio. Atributos podem ser aplicados a praticamente qualquer elemento de linguagem tipos, propriedades, mtodos e assim por diante. Tipo de acessibilidade Todos os tipos tm um modificador de acessibilidade que rege sua acessibilidade a outros tipos. A tabela a seguir descreve a acessibilidade de tipo suportada pelo runtime. Acessibilidade Pblico Descrio O tipo acessvel por todos os assemblies.
Visual C# Consolidado
422
Assembly
A acessibilidade de um tipo aninhado depende do seu domnio de acessibilidade, que determinado pelas acessibilidade declarada do membro e pelo domnio de acessibilidade do tipo imediatamente contido. Entretanto, o domnio de acessibilidade de um tipo aninhado no pode exceder o do tipo contido. O domnio de acessibilidade de um membro aninhado M declarado em um tipo T de um programa P definido como segue (observando que M, por si s, pode ser um tipo):
Se a acessibilidade declarada de M for public, o domnio de acessibilidade de M o domnio de acessibilidade de T. Se a acessibilidade declarada de M for protected internal, o domnio de acessibilidade de M a interseo do domnio de acessibilidade de T com o do texto do programa de P, e o texto do programa de qualquer tipo derivado de T, declarado fora de P. Se a acessibilidade declarada de M for protected, o domnio de acessibilidade de M a interseo do domnio de acessibilidade de T com o texto do programa de T, e qualquer tipo derivado de T. Se a acessibilidade declarada de M for internal, o domnio de acessibilidade de M a interseo do domnio de acessibilidade de T com o texto de programa de P. Se a acessibilidade declarada de M for private, o domnio de acessibilidade de M o texto de programa de T.
Nomes de Tipos O CTS impe apenas duas restries de nomes: 1. 2. Todos os nomes so codificados como seqncias de caracteres Unicode (16 bits). No so permitidos nomes que tenham um valor (16 bits) incorporado de 0x0000.
Todas as comparaes so feitas em uma base byte-by-byte, e possuem, portanto, diferenciao de maisculas e minsculas e so independentes de local Embora um tipo possa fazer referncia a tipos de outros mdulos e assemblies, um tipo totalmente definido dentro de um mdulo. Nomes de tipo precisam somente ser exclusivos em um assembly. Para identificar totalmente um tipo, o nome do tipo deve ser qualificado pelo assembly que contm a implementao do tipo. Para mais informaes, consulte Especificando Nomes de Tipos Totalmente Qualificados. Tipos Base e Interfaces Um tipo pode herdar valores e comportamentos de outro tipo. O CTS no permite que tipos sejam herdados de mais de um tipo base. Um tipo pode implementar qualquer nmero de interfaces. Para implementar uma interface, um tipo deve implementar todos os membros virtuais da interface. Um mtodo virtual pode ser implementado por um tipo derivado e pode ser chamado esttica ou dinamicamente. Para obter mais informaes sobre membros virtuais, consulte Membros de Tipos. Para obter mais informaes sobre herana e interfaces, consulte Classes e Interfaces. Membros de Tipos
Visual C# Consolidado
423
O comportamento e estado de um tipo so definidos pelos membros do tipo: eventos, campos, tipos aninhados, mtodos e propriedades. Para mais informaes, consulte Membros de Tipos.
Membros de Tipos
O ambiente de execuo permite que voc defina os membros do tipo: eventos, campos, tipos aninhados, mtodos e propriedades. Cada membro tem uma assinatura. A tabela a seguir descreve os membros usados no .NET Framework. Membro Evento Descrio Define um incidente ao qual pode-se responder e define mtodos para inscrever em, cancelar a inscrio em e levantar um evento. Eventos so freqentemente usados para informar outros tipos de alteraes de estado. Descreve e contm parte do estado do tipo. Campos podem ser de qualquer tipo suportado pelo ambiente de execuo. Define um tipo dentro do escopo do tipo delimitador. Descreve as operaes disponveis no tipo. A assinatura do mtodo especifica os tipos dos argumentos e o valor de retorno do mtodo. O construtor um tipo especial de mtodo que cria novas instncias de um tipo.
Propriedade Nomeia um valor ou um estado do tipo e define mtodos para obter ou definir o valor da propriedade. Propriedades podem ser tipos primitivos, colees de tipos primitivos, tipos definidos pelo usurio ou colees de tipos definidos pelo usurio. Propriedades so freqentemente usadas para manter a interface pblica de um tipo, independente da representao real do tipo. Caractersticas de um Membro O CTS (Common Type System) permite que os membros possuam uma variedade de caractersticas, mas as linguagens no necessariamente suportam todas elas. A tabela a seguir descreve as caractersticas de um membro. Pode ser aplicada a Mtodos, propriedades e eventos
Caracterstica abstract
Descrio O tipo no fornece a implementao do mtodo. Tipos que herdam mtodos abstratos e tipos que implementam interfaces com mtodos abstratos devem fornecer uma implementao para o mtodo. A nica exceo quando o tipo derivado um tipo abstrato. Todos os mtodos abstratos so virtuais. Define a acessibilidade de um membro: private Acessvel somente dentro do tipo do membro ou dentro de um tipo aninhado. family Acessvel dentro do tipo do membro e dentro de um tipo derivado que herda do tipo do membro. assembly Acessvel somente no assembly no qual o tipo definido. family e assembly
Todos
Visual C# Consolidado
424
Acessveis somente dentro de tipos que se cumprem tanto as restries de acesso da caracterstica family quanto da caracterstica assembly. family ou assembly Acessveis somente dentro de tipos que se cumprem as restries de acesso da caracterstica family ou as restries da caracterstica assembly. public Acessveis dentro de qualquer tipo. final Mtodos, propriedades e eventos Campos Campos, mtodos, propriedades e eventos Um mtodo virtual no pode ser substitudo em um tipo derivado. O valor pode apenas ser inicializado, no pode ser gravado outro valor aps a inicializao. Se um membro no estiver marcada como static (C# e C++), Shared (Visual Basic), virtual. (C# e C++) ou Overridable (Visual Basic), ele um membro da instncia (no existe a palavra-chave instance). Haver o mesmo nmero de cpias desses membros na memria e de objetos que os usam. O valor atribudo ao campo um valor fixo, conhecido em tempo de compilao, de um tipo de valor interno. s vezes, campos marcados como literal so chamados de constantes. Define como o membro interage com os membros herdados que possuem a mesma assinatura: newslot Oculta membros herdados que possuem a mesma assinatura. override Substitui a definio de um mtodo virtual herdado. O padro newslot. O membro pertence ao tipo no qual est definido e no a uma instncia particular do tipo. O membro existe mesmo que uma instncia de tipo no tenha sido criada. Ele compartilhado entre todas as instncias do tipo. O mtodo pode ser implementado por um tipo derivado e pode ser chamado estaticamente ou dinamicamente. Se foi usada uma chamada dinmica, o tipo da instncia que fez a chamada em tempo de execuo determina qual implementao do mtodo deve ser chamada, e no o tipo conhecido em tempo de compilao. Para chamar um mtodo virtual estaticamente, pode ser necessrio converter a varivel (usando o operador cast) para um tipo que usa a verso desejada do mtodo.
initialize-only instance
literal
Campos
newslot ou override
Todos
static
virtual
Sobrecarga
Visual C# Consolidado
425
Cada membro de tipo tem uma assinatura nica. A assinatura de um mtodo consistem do nome do mtodo e da lista de parmetros (a ordem e tipos dos argumentos do mtodo). Mais de um mtodo com o mesmo nome pode ser definido em um tipo desde que as assinaturas sejam diferentes. Quando dois ou mais mtodos com o mesmo nome so definidos, diz-se que o mtodo est sobrecarregado. Listas de parmetros podem ser qualificadas por restries varargs, indicando que o mtodo suporta uma lista de argumentos varivel. Por exemplo, em System.Char, o mtodo IsDigit est sobrecarregado. Um mtodo recebe um Char e retorna um Boolean, outro mtodo recebe um Int32 e uma String e retorna um Boolean Herana, Substituio e Membros Ocultos Um tipo derivado herda todos os membros do seu tipo base, ou seja, esses membros esto definidos no tipo derivado e disponveis para o mesmo. O comportamento, ou qualidades, de membros herdados pode ser modificado de duas maneiras:
Um tipo derivado pode ocultar um membro herdado definindo um novo membro com a mesma assinatura. Isso pode ser feito quando deseja-se tornar um membro pblico em privado ou para definir um novo comportamento para um mtodo herdado que est marcado como final. Um tipo derivado pode substituir um mtodo virtual herdado. O novo mtodo fornece uma nova definio do mtodo original. Essa nova definio ser chamada baseando-se no tipo do valor em tempo de execuo, em vez de no tipo conhecido em tempo de compilao. Um mtodo s pode substituir um mtodo virtual se o mtodo virtual no est marcado como final. O novo mtodo est pelo menos to acessvel quanto o mtodo virtual.
Tipos de valor interno O .NET Framework define Tipos de valor interno, como System.Int32 e System.Boolean, que correspondem e so idnticos aos tipos de dados primitivos usados por linguagens de programao.
Tipos de valor definidos pelo usurio A sua linguagem fornecer maneiras para definir seus prprios tipos de valor, que derivam de System.ValueType ou System.Enum. Se voc desejar definir um tipo representando um valor que seja pequeno, como um nmero complexo (usando dois nmeros de ponto flutuante), voc pode optar por defini-lo como um tipo de valor porque voc pode passar por valor o tipo de valor com eficincia. Se voc estiver definindo um tipo que seria mais eficientemente passado por referncia, em vez disso, voc deve defini-lo como uma classe .
Para obter informaes especficas sobre enumaraes, consulte Enumeraes no Common Type System (CTS). Tipos de valor so armazenados to eficientemente quanto tipos primitivos, mas voc pode chamar mtodos neles, incluindo os mtodos virtuais definidos nas classes System.ValueType e System.Object, assim como quaisquer mtodos definidos no prprio tipo de valor. Voc pode criar instncias de tipos de valor, pass-los como parmetros, armazen-los como variveis locais, ou armazen-los em um campo de outro tipo de valor ou objeto. Tipos valor no tm a sobrecarga associada com o armazenamento de uma instncia de uma classe e eles no exigem construtores.
Visual C# Consolidado
426
Para cada tipo de valor, o tempo de execuo fornece um tipo convertido (boxed) correspondente, que uma classe que tem o mesmo estado e comportamento que o tipo de valor. Algumas linguagens exigem que voc utilize sintaxe especial quando o tipo convertido (boxed) necessrio; outras usam automaticamente o tipo convertido (boxed) quando for necessrio. Quando voc define um tipo de valor, voc est definindo o tipo convertido (boxed) e o tipo noconvertido (unboxed). Tipos de valor podem ter campos, propriedades e eventos. Eles tambm podem ter mtodos estticos e no-estticos. Quando eles so convertidos (boxed), eles herdam os mtodos virtuais de System.ValueType, e eles podem implementar zero ou mais interfaces. Tipos de valor so autenticados (sealed), o que significa que nenhum outro tipo pode ser derivado a partir deles. Entretanto, voc pode definir mtodos virtuais diretamente sobre o tipo de valor, e esses mtodos podem ser chamados tanto no na forma convertida (boxed) quanto na noconvertida (unboxed) do tipo. Embora voc no possa derivar outro tipo de um tipo de valor, voc pode definir mtodos virtuais em um tipo de valor quando voc estiver usando uma linguagem em que for mais conveniente trabalhar com mtodos virtuais do que com mtodos no-virtuais ou estticos. O exemplo a seguir mostra como construir um tipo de valor para nmeros complexos. C#
using System; // Value type definition for a complex number representation. public struct Complex { public double r, i; // Constructor. public Complex(double r, double i) { this.r = r; this.i = i; } // Returns one divided by the current value. public Complex Reciprocal { get { if (r == 0d && i == 0d) throw new DivideByZeroException(); double div = r*r + i*i; return new Complex(r/div, -i/div); } } // Conversion operators. public static explicit operator double(Complex a) { return a.r; } public static implicit operator Complex(double r) { return new Complex(r,0d); } // Basic unary operators. public static Complex operator + (Complex a) { return a; } public static Complex operator - (Complex a) { return new Complex(-a.r, -a.i); } // Basic binary operators for addition, subtraction, multiplication, and division. public static Complex operator + (Complex a, Complex b) { return new Complex(a.r + b.r, a.i + b.i); } public static Complex operator (Complex a, Complex b) { return new Complex(a.r - b.r, a.i - b.i); } public static Complex operator * (Complex a, Complex b) { return new Complex(a.r*b.r - a.i*b.i, a.r*b.i + a.i*b.r); } public static Complex operator / (Complex a, Complex b) { return a * b.Reciprocal; } // Override the ToString method so the value appears in write statements. public override string ToString() { return String.Format("({0}+{1}i)", r, i); } } // Entry point. public class ValueTypeSample { public static void Main() { Complex a = new Complex(0, 1); Complex b = new Complex(0, -2); Console.WriteLine(); Console.WriteLine("a = " + a); Console.WriteLine("b = " + b); Console.WriteLine(); Console.WriteLine("a + b = " + (a+b)); Console.WriteLine("a - b = " + (a-b)); Console.WriteLine("a * b = " + (a*b)); Console.WriteLine("a / b = " + (a/b)); Console.WriteLine(); Console.WriteLine("(double)a = " + (double)a); Console.WriteLine("(Complex)5 = " + (Complex)5); } }
Visual C# Consolidado
427
definio quanto a implementao, ela pode ter um ou mais membros que no possuem implementao. Uma instncia de uma classe um objeto. Voc acessa as funcionalidades de um objeto chamando seus mtodos e acessando suas propriedades, eventos, e campos. A tabela a seguir fornece uma descrio de algumas das caractersticas que o tempo de execuo permite para uma classe. (Caractersticas adicionais que esto disponveis atravs de classes de Atributos no so includas nesta lista.) Sua linguagem pode no tornar todas essas caractersticas disponveis. Caracterstica autenticada implementa Abstrata Herda Descrio Especifica que outro tipo no pode ser derivado desse tipo. Indica que a classe usa uma ou mais interfaces, fornecendo implementaes de membros da interface. Especifica que voc no pode criar uma instncia da classe. Para us-la, voc deve derivar outra classe a partir dela. Indica que as instncias da classe podem ser usadas em qualquer lugar em que a classe base for especificada. Uma classe derivada que herda de uma classe base pode usar a implementao de qualquer mtodo virtual fornecido pela classe base, ou a classe derivada pode substitu-los com sua prpria implementao.
exportada ou no Indica se uma classe est visvel fora do Assembly em que ela est definida. exportada S se aplica a classes de alto nvel. Classes aninhadas tambm tm caractersticas membros. Para mais informaes, consulte Tipos membros. Membros da classe que no tm implementao so membros abstratos. Uma classe que tenha um ou mais membros abstratos ela prpria abstrata; no possvel criar novas instncias dessa classe. Algumas linguagens que direcionam o tempo de execuo permitem que voc marque uma classe como abstrata mesmo que nenhum de seus membros seja abstrato. Voc pode usar uma classe abstrata quando voc precisar encapsular um conjunto bsico de funcionalidades que as classes derivadas podem herdar ou substituir quando for apropriado. Classes que no so abstratas so chamadas de classes concretas. Uma classe pode implementar qualquer nmero de interfaces, mas ela pode herdar apenas da uma classe base. Todas as classes devem ter pelo menos um construtor, que inicializa novas ocorrncias da classe. Cada linguagem com suporte ao tempo de execuo fornece uma maneira para indicar que uma classe ou membros da classe tem caractersticas especficas. Quando voc usa a sintaxe exigida pela sua linguagem, a linguagem garante que as caractersticas da classe e seus membros so armazenados (como Metadados) junto com a implementao da classe.
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.
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.
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.
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
Descrio do Assembly. Identidade (nome, verso, cultura, chave pblica). Os tipos que so exportados. Outros conjuntos de que este assembly depende. Permisses de segurana necessrias para executar. Descrio dos tipos. Nome, visibilidade, classe base e interfaces implementadas. Membros (mtodos, campos, propriedades, eventos, tipos aninhados). Atributos. Elementos descritivos adicionais que modificam tipos e membros.
Benefcios de Metadados Os metadados so a chave para um modelo de programao simples, eliminando a necessidade de arquivos de Interface Definition Language (IDL), arquivos de cabealho ou qualquer mtodo externo de referncia a componente. Os metadados permitem que linguagens .NET se descrevam automaticamente de uma maneira neutra com relao a linguagem, sem que o desenvolvedor e o usurio vejam. Alm disso, metadados so extensveis pelo uso de atributos. Os metadados oferecem os seguintes benefcios principais:
Arquivos autodescritivos. Mdulos Common Language Runtime e assemblies so autodescritivos. Os metadados de um mdulo contm tudo o que ele precisa para interagir com outro mdulo. Os metadados fornecem automaticamente a funcionalidade de IDL no COM, permitindo que voc use um arquivo para definio e implementao. Mdulos Runtime e assemblies no exigem registro com o sistema operacional. Como resultado, as descries usadas pelo Runtime sempre refletem o cdigo real no arquivo compilado, o que aumenta a confiabilidade do aplicativo.
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.
Visual C# Consolidado
434
programao sendo descrito. Se voc definir um mtodo em C# e compil-lo em um arquivo PE, o seguinte smbolo de metadados pode ser gerado na parte MSIL do arquivo PE:
0x06000004
O byte superior (0x06) indica que esse um token MethodDef. Os trs bytes inferiores (000004) informam ao Common Language Runtime para procurar na quarta linha da tabela MethodDef pelas informaes que descrevem essa definio de mtodo. Metadados em um arquivo PE Quando um programa compilado para o Common Language Runtime, ele convertido em um arquivo PE que consiste de trs partes. A tabela a seguir descreve o contedo de cada parte. Seo do arquivo PE Cabealho
Contedo da seo O ndice das sees principais do arquivo PE e o endereo do ponto de entrada. O ambiente de execuo usa essas informaes para identificar o arquivo como um arquivo PE e para determinar onde se iniciada a execuo ao carregar o programa na memria. As instrues da Microsoft Intermediate Language (MSIL) que compem o seu cdigo. Muitas instrues da MSIL so acompanhadas de smbolos de metadados. Tabelas e heaps de metadados. O ambiente de execuo usa essa seo para registrar as informaes sobre cada tipo e cada membro em seu cdigo. Essa seo tambm inclui atributos personalizados e informaes de segurana.
Quando o cdigo executado, o ambiente de execuo carrega o mdulo na memria e consulta os metadados para esta classe. Aps carregado, o ambiente de execuo executa uma ampla anlise do fluxo Microsoft Intermediate Language (MSIL) do mtodo para convert-lo em instrues de mquina nativas rpidas. ambiente de tempo de execuo usa um compilador JustIn-Time (JIT) para converter as instrues MSIL para cdigo de mquina nativo para um mtodo ao mesmo tempo conforme o necessrio. O exemplo a seguir mostra parte do MSIL produzido a partir da funo Main do cdigo anterior. Voc pode visualizar o MSIL e os metadados de qualquer aplicativo .NET Framework usando o Desassemblador do MSIL (ILDASM.exe).
Visual C# Consolidado
435
.entrypoint .maxstack 3 .locals ([0] int32 ValueOne, [1] int32 ValueTwo, [2] int32 V_2, [3] int32 V_3) IL_0000: ldc.i4.s 10 IL_0002: stloc.0 IL_0003: ldc.i4.s 20 IL_0005: stloc.1 IL_0006: ldstr "The Value is: {0}" IL_000b: ldloc.0 IL_000c: ldloc.1 IL_000d: call int32 ConsoleApplication.MyApp::Add(int32,int32) /* 06000003 */
O compilador JIT l o MSIL para o mtodo inteiro, analisa-o completamente, e gera instrues nativas eficientes para o mtodo. Em IL_000d, um token de metadados para o mtodo Add (/* 06000003 */) encontrado e o ambiente de tempo de execuo usa o token para consultar a terceira linha da tabela MethodDef. A tabela a seguir mostra parte da tabela MethodDef referenciada pelo token de metadados que descreve o mtodo Add. Enquanto outras tabelas de metadados existirem neste assembly e tiverem seus prprios valores exclusivos, somente esta tabela examinada. Endereo virtual relativo Linha (RVA) 1 0x00002050 Nome (Aponta para Assinatura o heap de seqncia (Aponta para o de caracteres.) heap de blob.)
Public .ctor (construtor) ReuseSlot SpecialName RTSpecialName .ctor Public Static ReuseSlot Public Static ReuseSlot Main String
0x00002058
IL Managed IL Managed
0x0000208c
Add
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.
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.
Ele contm cdigo que o Common Language Runtime executa. O cdigo Microsoft Intermediate Language (MSIL), em um arquivo executvel portvel (PE), no ser executado se ele no possuir um manifesto do assembly associado. Observe que cada assembly pode ter somente um ponto de entrada (isto , DllMain, WinMain ou Main). Ele forma um limite de segurana. Um assembly a unidade em que permisses so solicitadas e concedidas. Para obter mais informaes sobre limites de segurana e como eles se aplicam a assemblies, consulte Consideraes Sobre Segurana do Assembly. Ele forma um limite de tipo. A identidade de cada tipo inclui o nome do assembly no qual ele reside. Um tipo chamado MyType, carregado no escopo de um assembly, no o mesmo que um tipo chamado MyType, carregado no escopo de outro assembly. Ele forma um limite de referncia de escopo. O manifesto do assembly contm metadados do assembly que so usados para resolver tipos e satisfazer solicitaes de recursos. Ele especifica os tipos e recursos que so expostos fora do assembly. O manifesto tambm enumera outros assemblies do qual ele depende. Ele forma um limite de verso. O assembly a menor unidade com controle de verso no Common Language Runtime; todos os tipos e recursos no mesmo assembly esto versionados como uma unidade. O manifesto do assembly descreve as dependncias de verso que voc especifica para qualquer assembly dependente. Para obter mais informaes sobre o controle de verso, consulte Controle de Verso do Assembly. Ele forma uma unidade de implantao. Quando um aplicativo iniciado, somente os mdulos assembly que o aplicativo chama inicialmente devem estar presente. Outros assemblies, como recursos de localizao ou assemblies contendo classes utilitrias, podem ser recuperados por demanda. Isso permite que aplicativos sejam mantidos simples e pequenos no primeiro download. Para obter mais informaes sobre como implantar assemblies, consulte Implantao de Aplicativos. Essa a unidade na qual a execuo lado a lado suportada. Para obter mais informaes sobre como executar vrias verses de um assembly, consulte Assemblies e Execuo Lado a Lado.
Assemblies podem ser estticos ou dinmicos. Assemblies estticos podem incluir tipos .NET Framework (interfaces e classes), bem como recursos para o assembly (bitmaps, arquivos JPEG, arquivos de recursos, e assim por diante). Assemblies estticos so armazenados em disco em arquivos PE. Voc tambm pode usar o .NET Framework para criar assemblies dinmicos, que so executados diretamente da memria e no so salvos em disco antes da execuo. Voc pode salvar assemblies dinmicos no disco aps sua execuo. H vrias maneiras de criar assemblies. Voc pode usar ferramentas de desenvolvimento, como Visual Studio 2005, que voc usou anteriormente para criar arquivos .dll ou .exe. Voc pode usar ferramentas fornecidas pelo SDK do .NET Framework para criar assemblies, com mdulos criados em outros ambientes de desenvolvimento. Voc tambm pode usar APIs do Common Language Runtime, como Reflection.Emit, para criar assemblies dinmicos.
Visual C# Consolidado
437
Benefcios do Assembly
Assemblys so projetados para simplificar a implantao de aplicativos e para solucionar problemas de versionamento que podem ocorrer em aplicativos baseados em componentes. Usurios finais e desenvolvedores esto familiarizados com problemas de versionamento e implantao. Problemas esses que surgem nos atuais sistemas baseados em componentes. Alguns usurios finais tm sofrido a frustrao de instalar um novo aplicativo em seus computadores apenas para descobrir que outro aplicativo existente simplesmente parou de funcionar. Muitos desenvolvedores j gastaram inmeras horas tentando manter consistentes todas as entradas do registro necessrias para ativar uma classe COM. Muitos problemas de implantao tm sido resolvidos atravs uso de assemblys no .NET Framework. Por eles seres componentes autodescritivos e por no dependerem de entradas do registro, assemblys permitem que a instalao de aplicativos no tenha impacto algum. Eles tambm simplificam a desinstalao e duplicao de aplicativos. Problemas de Versionamento Atualmente, dois problemas de versionamento ocorrem em aplicativos Win32:
Regras de versionamento no podem ser expressas entre partes de um aplicativo e impostas pelo sistema operacional. A abordagem atual depende da compatibilidade com verses anteriores, o que geralmente difcil de garantir. Uma vez publicadas, as definies de interface devem ser estticas. Uma nica parte do cdigo deve manter a compatibilidade com as verses anteriores. Alm disso, o cdigo deve ser desenvolvido de forma que somente uma nica verso do mesmo possa estar presente e executando em um computador em qualquer instante de tempo. No h como manter a consistncia entre conjuntos de componentes que so criados juntos e o conjunto que est presente em tempo de execuo.
Esses dois problemas de versionamento combinados criam conflitos de DLL, onde a instalao de um aplicativo pode, inadvertidamente, quebrar um outro existente. Isso ocorre porque foi instalado um determinado componente de software, ou DLL, que no era totalmente compatvel com as verses anteriores. Aps decorrida essa situao, o sistema no possui suporte para diagnosticar e corrigir o problema. Acabando com os conflitos de DLL O Microsoft Windows 2000 comeou a atacar por completo esses problemas. Ele fornece dois recursos que corrigem parcialmente conflitos de DLL:
O Windows 2000 permite criar aplicativos cliente cujos arquivos .dll localizam-se na mesma pasta do executvel do aplicativo. O Windows 2000 pode ser configurado para verificar um componente no diretrio onde o executvel est localizado antes de verificar o caminho totalmente qualificado ou procurar o caminho normal. Isso permite que componentes sejam independentes de componentes instalados e usados por outros aplicativos. O Windows 2000 bloqueia arquivos que vm com o sistema operacional no diretrio System32, para que eles no possam ser substitudos quando novos aplicativos so instalados.
O Common Language Runtime usa assemblys para continuar essa evoluo em direo de uma soluo completa para conflitos de DLL. A Soluo do Assembly
Visual C# Consolidado
438
Para resolver problemas de versionamento, assim como problemas restantes que levam a conflitos de DLL, o ambiente de execuo usa assemblys a fim de:
Permitir que os desenvolvedores especifiquem regras de verso entre diferentes componentes de software. Fornecer a infra-estrutura para impor regras de verso. Fornecer a infra-estrutura para permitir que vrias verses de um componente sejam executadas simultaneamente (o que chamamos de execuo lado a lado).
Consulte tambm
Sumrio de assembly
Em geral, um assembly esttico pode consistir de quatro elementos:
O manifesto do assembly, que contm metadados do assembly. Metadados de tipo. Cdigo Microsoft Intermediate Language (MSIL) que implementa os tipos. Um conjunto de recursos.
Somente o manifesto do assembly obrigatrio, mas tipos e recursos so ambos necessrios para fornecer ao assembly qualquer funcionalidade significativa. H vrias maneiras de se agrupar esses elementos em um assembly. Voc pode agrupar todos os elementos em um nico arquivo fsico, que mostrado na ilustrao a seguir. Assembly de arquivo nico
Como alternativa, os elementos de um assembly podem estar contidos em vrios arquivos. Esses arquivos podem ser mdulos de cdigo compilado (.netmodule), recursos (como arquivos .bmp ou .jpg), ou outros arquivos necessrios para o aplicativo. Crie um assembly multi-arquivos quando desejar combinar mdulos escritos em diferentes linguagens e otimizar o download de um aplicativo colocando tipos raramente usados em um mdulo que baixado apenas quando necessrio. Na ilustrao a seguir, o desenvolvedor de um aplicativo hipottico escolheu separar alguns cdigos utilitrios em um mdulo diferente e manter um arquivo grande de recurso (neste caso uma imagem .bmp) em seu arquivo original. O .NET Framework baixa um arquivo somente quando ele referenciado; manter cdigos raramente referenciados em um arquivo separado do aplicativo otimiza o download de cdigo. Assembly multi-arquivos
Visual C# Consolidado
439
Observao Os arquivos que compem um assembly multi-arquivos no so fisicamente vinculados pelo sistema de arquivos. Em vez disso, eles so vinculados atravs do manifesto do assembly e o Common Language Runtime gerencia-os como uma unidade. Nesta ilustrao, todos os trs arquivos pertencem a um assembly, conforme descrito no manifesto do assembly contido em MyAssembly.dll. Para o sistema de arquivos, eles so trs arquivos separados. Observe que o arquivo Util.netmodule foi compilado como um mdulo porque ele no contm nenhuma informao de assembly. Quando o assembly foi criado, o manifesto do assembly foi adicionado ao MyAssembly.dll, indicando seu relacionamento com Util.netmodule e Graphic.bmp. Assim como voc cria hoje seu cdigo-fonte, voc toma decises sobre como particionar a funcionalidade do seu aplicativo em um ou mais arquivos. Ao criar cdigo do .NET Framework, voc tomar decises semelhantes sobre como particionar a funcionalidade em um ou mais assemblies.
Manifesto do Assembly
Cada assembly, seja esttico ou dinmico, contm uma coleo de dados que descrevem como os elementos do assembly se relacionam entre si. O manifesto do assembly contm esses metadados do assembly. O manifesto de um assembly contm todos os metadados necessrios para especificar os requisitos de verso e o identificador de segurana, assim como todos os metadados necessrios para definir o escopo do assembly e analisar referncias a recursos e classes. O manifesto do assembly pode ser armazenado em um arquivo PE (.exe ou .dll) com cdigo da Microsoft Intermediate Language (MSIL) ou em um arquivo PE autnomo que contm somente informaes do manifesto do assembly. A ilustrao a seguir mostra as diferentes maneiras nas quais o manifesto pode se armazenado. Tipos de assemblys
Visual C# Consolidado
440
Para um assembly com um arquivo associado, o manifesto incorporado no arquivo PE para formar um assembly de arquivo nico. Voc pode criar um assembly de vrios arquivos com um arquivo de manifesto autnomo ou com o manifesto incorporado a um dos arquivos PE do assembly. Cada manifesto de um assembly executa as seguintes funes:
Enumerar os arquivos que compem o assembly. Orientar como as referncias a tipos e recursos do assembly so mapeadas em arquivos que contm suas declaraes e implementaes. Enumerar outros assemblys dos quais depende o assembly. Fornecer um nvel de indireo entre os consumidores do assembly e detalhes da implementao do assembly. Processar o assembly autodescritivo.
Contedo do Manifesto do Assembly A tabela a seguir mostra as informaes contidas no manifesto do assembly. Os primeiros quatro itens informaes sobre o nome, o nmero de verso, a cultura e o nome forte do assembly compem a identidade do assembly. Informaes Descrio
Nome do assembly Uma seqncia de texto especificando o nome do assembly. Nmero de verso Um nmero de verso principal e secundrio e um nmero de reviso e de compilao. O Common Language Runtime usa esses nmeros para impor uma poltica de verses. Informaes sobre a cultura ou a linguagem suportada pelo assembly. Essas informaes devem ser usadas somente para designar um assembly como um assembly satlite contendo informaes especficas de cultura ou de linguagem. (Um assembly com informaes de cultura automaticamente considerado um assembly satlite.) A chave pblica do publisher, caso tenha sido dado ao assembly um nome forte. Um hash de cada arquivo contido no assembly e um nome de arquivo. Observe que todos os arquivos que compem o assembly devem estar no mesmo diretrio que o arquivo que contm o manifesto do assembly. Informaes usadas pelo ambiente de execuo para mapear a referncia
Cultura
Visual C# Consolidado
441
de um tipo ao arquivo que contm sua declarao e implementao. Usado para tipos que so exportados do assembly. Uma lista de outros assemblys que so referenciados estaticamente pelo assembly. Cada referncia inclui o nome do assembly dependente, metadados do assembly (verso, cultura, sistema operacional, e assim por diante) e chave pblica, caso o assembly possua um nome forte.
Voc pode adicionar ou alterar informaes do manifesto do assembly usando os atributos do assembly em seu cdigo. Voc pode alterar informaes sobre verso e atributos informativos, incluindo Trademark (marca comercial), Copyright (direitos autorais), Product (produto), Company (empresa) e Informational Version (verso informativa). Para obter uma lista completa dos atributos de um assembly, consulte Definindo os Atributos de um Assembly.
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.
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.
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.
Visual C# Consolidado
443
A evidncia de entrada ser mesclada com a evidncia coletada pelo carregador para criar um conjunto final de evidncias usadas para resoluo de poltica. Os mtodos que usam essa semntica incluem Assembly.Load, Assembly.LoadFrom e Activator.CreateInstance. A evidncia de entrada usada inalterada como o conjunto final de evidncias usado para resoluo de poltica. Os mtodos que usam essa semntica incluem AppDomain.DefineDynamicAssembly() e Assembly.Load(byte[]).
Permisses opcionais podem ser concedidas pelo conjunto de polticas de segurana no computador onde o assembly ser executado. Se voc desejar que seu cdigo manipule todas as excees de segurana potenciais, voc pode seguir um desses procedimentos:
Inserir uma solicitao de permisso para todas as permisses que seu cdigo deve ter, e tratar a falha em tempo de carga que ocorre se as permisses no so concedidas. No usar uma solicitao de permisso para obter permisses que seu cdigo pode no precisar, mas estar preparado para manipular excees de segurana se as permisses no so concedidas. Observao Segurana uma rea complexa, e voc tem vrias opes para escolher. Para mais informaes, consulte Conceitos chave sobre segurana.
Em tempo de carga, as evidncias do assembly so usadas como entrada para polticas de segurana. A poltica de segurana estabelecida pela empresa e pelo administrador do computador bem como por configuraes de polticas de usurio e determina o conjunto de permisses que concedido a todos os cdigos gerenciados quando executados. Polticas de segurana podem ser estabelecidas para o publisher do assembly (se ele tiver uma assinatura gerada por uma ferramenta de assinatura), para o site e zona (em termos do Internet Explorer) de que o assembly foi baixado, ou para o nome forte do assembly. Por exemplo, um administrador pode estabelecer polticas de segurana que permitem que todo cdigo baixado do site e assinado por uma determinada de empresa software acesse um banco de dados em um computador, mas no concede acesso para gravar no disco do computador. Assemblies de nome forte e ferramentas de assinatura Voc pode assinar um assembly de duas maneiras diferentes mas complementares: com um nome forte ou usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) no .NET Framework verso 1.0 e 1.1 ou a Ferramenta de Assinatura (SignTool.exe) em verses posteriores do .NET Framework. Assinar um assembly com um nome forte adiciona uma criptografia de chave pblica ao arquivo que contm o manifesto do assembly. Assinatura de nome forte ajuda a verificar exclusividade de nome, a evitar falsificao de nome, e a fornecer chamadores com alguma identidade quando uma referncia resolvida. No entanto, nenhum nvel de confiana associado a um nome forte, o que torna a Ferramenta de Assinatura de Arquivo (Signcode.exe) e Ferramenta de Assinatura (SignTool.exe) importantes. As duas ferramentas de assinatura requerem um publisher para provar sua identidade para uma autoridade de terceiros e obter um certificado. Esse certificado ento incorporado no seu arquivo e pode ser usado por um administrador para decidir se confia na autenticidade do cdigo. Voc pode dar um nome forte e uma assinatura digital criada usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) ou a Ferramenta de Assinatura (SignTool.exe) para um assembly, ou voc pode usar um sozinho. As duas ferramentas de assinatura podem assinar somente um arquivo por vez; para um assembly com vrios arquivos, voc assina o arquivo que contm o manifesto do assembly. Um nome forte armazenado no arquivo que contm o manifesto do
Visual C# Consolidado
444
assembly, mas uma assinatura criada usando a Ferramenta de Assinatura (SignTool.exe) ou a Ferramenta de Assinatura de Arquivo (Signcode.exe) armazenada em um slot reservado no arquivo executvel portvel (PE) que contm o manifesto do assembly. A assinatura de um assembly usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) ou a Ferramenta de Assinatura (SignTool.exe) pode ser usada (com ou sem um nome forte) quando voc j tem uma hierarquia de confiana que confia nas assinaturas geradas pela Ferramenta de Assinatura de Arquivo (Signcode.exe) ou pela Ferramenta de Assinatura (SignTool.exe), ou quando sua poltica usa somente a parte chave e no verifica uma cadeia de confiana. Observao Ao usar um nome forte e uma assinatura gerada por uma ferramenta de assinatura em um assembly, o nome forte deve ser atribudo primeiro. O Common Language Runtime tambm executa uma verificao de hash; o manifesto do assembly contm uma lista de todos os arquivos que compem o assembly, incluindo um hash de cada arquivo como ele existia quando o manifesto foi criado. Como cada arquivo carregado, seu contedo comparado com o valor de hash armazenado no manifesto. Se os dois hashes no coincidirem, o assembly falha ao carregar. Devido ao nome forte e assinatura usarem a garantia de integridade da Ferramenta de Assinatura de Arquivo (Signcode.exe) ou da Ferramenta de Assinatura (SignTool.exe), voc pode basear a poltica de segurana para acesso a cdigo nessas duas formas de evidncias do assembly. Nome forte e assinatura usam garantia de integridade da Ferramenta de Assinatura (SignTool.exe) ou da Ferramenta de Assinatura de Arquivo (Signcode.exe) atravs de assinaturas digitais e certificados. Todas as tecnologias mencionadas Verificao de hash, nome forte, e assinatura usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) ou a Ferramenta de Assinatura (SignTool.exe) trabalham juntas para assegurar que o assembly no tenha sido alterado de nenhuma maneira.
Versionamento de Assembly
Todos os versionamentos de assemblys que usam o Common Language Runtime so feitos no nvel do assembly. A verso de um assembly e as verses de assemblys dependentes so registradas no manifesto do assembly. O poltica de verses padro do ambiente de execuo diz que aplicativos devem executar somente com as verses com que foram criados e testados, a menos que essa poltica de verses seja anulada por uma outra poltica explcitada nos arquivos de configurao (o arquivo de configurao do aplicativo, o arquivo de poltica de editor e o arquivo de configurao do administrador do computador). Observao Versionamento feito somente em assemblys com nomes fortes. O ambiente de execuo executa as seguintes etapas para resolver uma solicitao de ligao de assembly: 1. 2. Verificar a referncia do assembly original para determinar qual verso do assembly deve ser ligada. Verificar os arquivos de configurao apropriados para aplicar um poltica de verses.
Visual C# Consolidado
445
3.
Determinar o assembly correto a partir da referncia do assembly original e de qualquer redirecionamento especificado nos arquivos de configurao. Determinar a verso que deve ser ligada ao assembly sendo chamado. Verifica a cache global de assemblys, bases de cdigo especificadas em arquivos de configurao, e, em seguida, verifica os diretrios e subdiretrios do aplicativo usando as regras de probing explicadas em Como o Ambiente de Execuo Localiza Assemblys.
4.
A ilustrao a seguir mostra essas etapas. Resolvendo uma solicitao de ligao de assembly
Para obter mais informaes sobre como configurar aplicativos, consulte Arquivos de Configurao. Para obter mais informaes sobre polticas de ligao, consulte Como o Ambiente de Execuco Localiza Assemblys. Informaes de Verso Cada assembly possui duas maneiras diferentes de expressar informaes de verso:
Atravs do nmero de verso do assembly. Juntamente com as informaes de nome e cultura do assembly, o nmero de verso parte da identidade do assembly. Esse nmero usado pelo ambiente de execuo para impor uma poltica de verses e representa um papel importante no processo de resoluo de tipo em tempo de execuo. Atravs de uma verso informativa, uma seqncia que representa informaes de verso adicionais includa apenas para fins informativos.
Nmero de Verso do Assembly Cada Assembly tem um nmero de verso como parte de sua identidade. Dessa forma, dois assemblys que diferem pelo nmero de verso so considerados pelo ambiente de execuo assemblys completamente diferentes. Fisicamente, esse nmero de verso representado atravs de uma seqncia dividida em quatro partes com o seguinte formato:
Visual C# Consolidado
446
< verso principal>.<verso secundria>.<nmero de compilao>.<reviso> Por exemplo, a verso 1.5.1254.0 indica que 1 a verso principal, 5 a verso secundria, 1254 o nmero de compilao e 0 o nmero de reviso. O nmero de verso armazenado no manifesto do assembly junto com outras informaes de a identidade, incluindo o nome e a chave pblica do assembly e informaes de relacionamentos e identidades de outros assemblys conectados ao aplicativo. Quando um assembly criado, a ferramenta de desenvolvimento registra as informaes de dependncia de cada assembly referenciado no manifesto do assembly. O ambiente de execuo usa esses nmeros verso, em conjunto com informaes de configurao definidas por um administrador, por um aplicativo, ou por um publisher, a fim de carregar a verso apropriada de um assembly referenciado. O ambiente de execuo distingue assemblys regulares de assemblys com nomes fortes para fins de versionamento. A verificao de verso s ocorre em assemblys com nomes fortes. Para obter informaes sobre como especificar uma poltica de ligao de verso, consulte Arquivos de Configurao. Para obter informaes sobre como o ambiente de execuo usa informaes de verso para localizar um Assembly especfico, consulte Como o Ambiente de Execuo Localiza Assemblys. Verso Informativa do Assembly A verso informativa uma seqncia que anexa informaes adicionais de verso a um assembly, apenas para fins informativos. Essas informaes no so usadas em tempo de execuo. A verso informativa baseada em texto corresponde a literatura de marketing do produto, a embalagem ou ao nome do produto e no usada pelo ambiente de execuo. Por exemplo, uma verso informativa poderia ser "Common Language Runtime verso 1.0" ou " NET Control SP 2 ". Na guia Version da caixa de dilogo File Properties do Microsoft Windows, essas informaes aparecem no item "Product Version". Observao Embora voc possa especificar qualquer texto, uma mensagem de aviso aparecer durante a compilao em dois casos: (i) se a seqncia no possuir o formato usado pelo nmero de verso do assembly ou (ii) se est no formato correto, mas contm wildcards. Esse aviso inofensivo. A verso informativa representada usando o atributo System.Reflection.AssemblyInformationalVersionAttribute. Para obter mais informaes sobre o atributo da verso informativa, consulte Definindo Atributos do Assembly.
Posicionamento do Assembly
Para a maioria dos aplicativos .NET Framework, voc localiza assemblies que compem um aplicativo no diretrio do aplicativo, em uma subpasta da pasta do aplicativo ou no cache global de assemblies (se o assembly for compartilhado). Voc pode substituir onde o Common Language Runtime procura por um assembly, usando o elemento <CODEBASE> em um arquivo de configurao. Se o assembly no tiver um nome forte, a localidade especificada usando o elemento <CODEBASE> restrita para o diretrio do aplicativo ou para a subpasta. Se o assembly tiver um nome forte, o elemento <CODEBASE> pode especificar qualquer localidade no computador ou em uma rede.
Visual C# Consolidado
447
Regras similares se aplicam localizao de assemblies ao trabalhar com cdigo no gerenciado ou aplicativos interop COM: se o assembly ser compartilhado por vrios aplicativos, ele dever ser instalado no cache global de assemblies. Assemblies usados com cdigos no gerenciados devem ser registrados e exportados como uma biblioteca de tipos. Assemblies usados pelo COM interop devem ser registrados no catlogo, embora em alguns casos, esse registro ocorra automaticamente.
Representar tipos de dados base e excees. Encapsular estruturas de dados. Executar E/S. Acessar informaes sobre os tipos carregados. Invocar as verificaes de segurana do .NET Framework. Fornecer acesso a dados, uma GUI detalhada do lado do cliente e uma GUI do lado do cliente controlada pelo servidor.
O .NET Framework fornece um rico conjunto de interfaces, bem como classes abstratas e concretas. Voc pode usar diretamente as classes concretas ou pode derivar suas prprias classes a partir delas. Para usar a funcionalidade de uma interface, voc pode criar uma classe que implementa a interface ou derivar uma classe de uma das classes do .NET Framework que implementa a interface. Convenes de Nomenclatura
Visual C# Consolidado
448
Os tipos do .NET Framework usam um esquema de nomenclatura de sintaxe de ponto que d a idia de hierarquia. Essa tcnica agrupa tipos relacionados em namespaces para que os tipos possam ser procurados e referenciados mais facilmente. A primeira parte do nome completo at o ponto mais a direita constitui o nome do namespace. A ltima parte do nome o nome do tipo. Por exemplo, System.Collections.ArrayList representa o tipo ArrayList que pertence ao namespace System.Collections. Os tipos em System.Collections podem ser usados para manipular colees de objetos. Esse esquema de nomenclatura facilita, para os desenvolvedores de bibliotecas, a extenso do .NET Framework a fim de criar grupos hierrquicos de tipos e nome-los de uma maneira consistente e informativa. Espera-se que os desenvolvedores de bibliotecas usem as seguintes diretrizes ao criar nomes para seus namespaces: NomeDaEmpresaNomeDaTecnologia Por exemplo, o namespace Microsoft.Word est de acordo com essa diretriz. O uso de padres de nomenclatura para agrupar tipos relacionados em namespaces uma maneira muito til de criar e documentar bibliotecas de classes. Entretanto, esse esquema de nomenclatura no tem efeito sobre a visibilidade, acesso a membro, herana, segurana ou vinculao. Um namespace pode ser particionado em vrios assemblys. Um nico assembly pode conter tipos de vrios namespaces diferentes. O assembly fornece a estrutura formal para o versionamento, a implantao, a segurana, o carregamento e a visibilidade no Common Language Runtime. Para obter mais informaes sobre namespaces e nomes de tipos, consulte CTS (Common Type System). O Namespace System O namespace System o namespace raiz para tipos fundamentais do .NET Framework. Esse namespace inclui classes que representam os tipos de dados base usados por todos os aplicativos: Object (a raiz da hierarquia de herana), Byte, Char, Array, Int32, String, etc. Muitos desses tipos correspondem aos tipos de dados primitivos que so usados pelas linguagens de programao. Quando voc escreve um cdigo usando os tipos do .NET Framework, voc pode usar a correspondente palavra-chave da linguagem onde um tipo de dado base do .NET Framework esperado. A tabela a seguir lista alguns dos tipos de valor que so fornecidos pelo .NET Framework. dada uma breve descrio cada tipo e uma indicao do tipo correspondente em Visual Basic, C# e C++. A tabela tambm inclui entradas para a classes Object e String, para as quais vrias linguagens possuem as palavras-chave correspondentes. Tipo de dado em Visual Basic Byte SByte
Categoria Inteiro
Descrio Um inteiro de 8 bits sem sinal. Um inteiro de 8 bits com sinal. No compatvel com CLS. Um inteiro de 16 bits com sinal.
Tipo de Tipo de dado em dado em C# C++ Byte sbyte char signed char short
Int16
Short
short
short
Visual C# Consolidado
449
Int32
Um inteiro de 32 bits com sinal. Um inteiro de 64 bits com sinal. Um inteiro e 16 bits sem sinal. No compatvel com CLS. Um inteiro de 32 bits sem sinal. No compatvel com CLS.
Integer
int
int -oulong __int64 unsigned short unsigned int -ouunsigned long unsigned __int64 float
int
Int64 UInt16
Long UShort
long ushort
long UInt16
UInt32
UInteger
uint
UInt32
UInt64
ULong
ulong
UInt64
Ponto flutuante
Single
Nmero de ponto flutuante Single de preciso simples (32 bits). Nmero de ponto flutuante Double de preciso dupla (64 bits). Um valor booleano (true ou false). Um caractere unicode (16 bits). Um valor decimal (128 bits). Um inteiro com sinal cujo tamanho depende da plataforma subjacente (um valor de 32 bits em uma plataforma de 32 bits e um valor de 64 bits em uma plataforma de 64 bits). Um inteiro sem sinal cujo tamanho depende da plataforma subjacente (um valor de 32 bits em uma plataforma de 32 bits e um valor de 64 bits em uma plataforma de 64 bits). No compatvel com CLS. A raiz da hierarquia de objeto. Boolean Char Decimal IntPtr Nenhum tipo interno.
float
float
UIntPtr
UIntPtr
Object
object string
Object* String*
Object String
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.
Visual C# Consolidado
451
Noes bsicas sobre implantao de .NET Framework Designers e o ambiente de design Eventos Excees Coleta de lixo GDI + Tipos genricos E/S Interoperabilidade Desenvolvimento mvel Estendendo suporte em tempo de design Tratamento e disparada de eventos Tratamento e lanamento de excees Coleta de lixo Elementos grficos e desenho em formulrios do Windows Reflexo e tipos genrico E/S de arquivo e de fluxo Interoperabilidade .NET Compact Framework Criando aplicativos mveis ASP .NET Redes Reflexo Programao de redes Reflexo
Arquitetura de comunicao remota Objetos remotos Viso geral sobre a arquitetura de comunicao remota do .NET Framework Segurana Segurana no .NET Framework Conceitos chaves sobre segurana Componentes atendidos Escrevendo componentes atendidos Viso geral sobre componentes atendidos Serializao Execuo lado a lado Threads Formulrios do Windows Serializao Execuo lado a lado Threads gerenciadas Formulrios do Windows no .NET Framework
Visual C# Consolidado
452
Como Criar uma Listagem de Diretrio O exemplo de cdigo a seguir mostra como usar as classes de E/s para criar uma lista de todos os arquivos com a extenso ".exe " em um diretrio. Exemplo C#
using System; using System.IO; class DirectoryLister { public static void Main(String[] args) { string path = "."; if (args.Length > 0) { if (File.Exists(args[0]) { path = args[0]; } else { Console.WriteLine("{0} not found; using current directory:", args[0]); } DirectoryInfo dir = new DirectoryInfo(path); foreach (FileInfo f in dir.GetFiles("*.exe")) { String name = f. Name; long size = f.Length; DateTime creationTime = f.CreationTime; Console.WriteLine("{0,-12:N0} {1,-20:g} {2}", size, creationTime, name); } } }
Programao robusta Neste exemplo, (.. ",) e o cdigo relaciona todos os arquivos na pasta atual ter uma extenso.exe, junto com seus tamanho do arquivo, hora de criao, e nome. " a pasta atual, indicada pelo DirectoryInfo Supondo que havia arquivos.exe na subpasta \Bin da C:\MyDir, a sada desse cdigo pode parecer isso:
953 7/20/2000 10:42 AM C:\MyDir\Bin\paramatt.exe 664 7/27/2000 3:11 PM C:\MyDir\Bin\tst.exe 403 8/8/2000 10:25 AM C:\MyDir\Bin\dirlist.exe
Se voc desejar uma lista de arquivos em outro diretrio, como o diretrio de raiz C:\, passar o argumento " C:\ " para o executvel gerado por compilao esse cdigo, por exemplo: " testApplication.EXE C:\ ". Observao Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo objeto My.Computer.FileSystem para a E/s de arquivos. Para obter mais informaes, consulte Objeto My.Computer.FileSystem. Como: Ler e gravar em um arquivo de dados recm criado O BinaryWriter e BinaryReader classes so usados para gravar e ler dados, em vez de caracteres seqncias. O exemplo de cdigo a seguir demonstra gravar dados e Ler dados de um fluxo de arquivo novo e vazio (Test.data). Aps criar os dados arquivos na pasta atual, a associada BinaryWriter e BinaryReader so criados, usado para gravar os inteiros 0 a 10 para Test.data, que deixa o ponteiro de arquivo no final do arquivo. e BinaryWriter Aps definir o ponteiro de arquivo volta para a origem, as BinaryReader leituras sem o contedo especificado.
Visual C# Consolidado
453
Exemplo C#
using System; using System.IO; class MyStream { private const string FILE_NAME = "Test.data"; public static void Main(String[] args) { // Create the new, empty data file. if (File.Exists(FILE_NAME)) { Console.WriteLine("{0} already exists!", FILE_NAME); return; } FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew); // Create the writer for data. BinaryWriter w = new BinaryWriter(fs); // Write data to Test.data. for (int i = 0; i < 11; i++) { w.Write( (int) i); } w.Close(); fs.Close(); // Create the reader for data. fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); BinaryReader r = new BinaryReader(fs); // Read data from Test.data. for (int i = 0; i < 11; i++) { Console.WriteLine(r.ReadInt32()); } r.Close(); fs.Close(); } }
Programao robusta Se Test.data acionada. j existe no diretrio atual, um IOException Usar FileMode.Create para criar um novo arquivo sem organizando sempre um IOException. Como: Abrir e anexar aum arquivo de log e StreamWriterStreamReader caracteres para gravar e ler caracteres fluxos. O exemplo de cdigo a seguir abre o log.txt arquivo para entrada, ou cria o arquivo se ele ainda no existir, e acrescenta informaes ao final do arquivo. O contedo do arquivo so gravados na sada padro para exibio. Como uma alternativa para este exemplo, as informaes pode ser armazenadas como uma nica seqncia ou matriz de seqncia, e a WriteAllText. ou WriteAllLines mtodo pode ser usado para obter a mesma funcionalidade Observao Do My.Application.Log Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo ou My.Computer.FileSystem objetos para criar ou gravar em arquivos de log. Para obter mais informaes, consulte Objeto My.Application.Log e Objeto My.Computer.FileSystem. Exemplo C#
using System; using System.IO; class DirAppend { public static void Main(String[] args) { using (StreamWriter w = File.AppendText("log.txt")) { Log ("Test1", w); Log ("Test2", w); // Close the writer and underlying file. w.Close(); } // Open and read the file. using (StreamReader r = File.OpenText("log.txt")) { DumpLog (r); } } public static void Log (String logMessage, TextWriter w) { w.Write("\r\nLog Entry : "); w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString()); w.WriteLine(" :"); w.WriteLine(" :{0}", logMessage); w.WriteLine ("-------------------------------"); // Update the underlying file. w.Flush(); } public static void DumpLog (StreamReader r) { // While not at the end of the file, read and write lines. String line; while ((line=r.ReadLine())!=null) { Console.WriteLine(line); } r.Close(); }}
Como Escrever Texto em um Arquivo Os exemplos de cdigo a seguir mostram como gravar texto em um arquivo de texto.
Visual C# Consolidado
454
O primeiro exemplo mostra como adicionar texto a um arquivo existente. O segundo exemplo mostra como criar um novo arquivo de texto e gravar uma seqncia a ele. Funcionalidade semelhante pode ser fornecida pelos mtodos WriteAllText. Observao Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo objeto My.Computer.FileSystem para a E/s de arquivos. Para obter mais informaes, consulte Objeto My.Computer.FileSystem. Exemplo C#
using System; using System.IO; class Test { public static void Main() { // Create an instance of StreamWriter to write text to a file. // The using statement also closes the StreamWriter. using (StreamWriter sw = new StreamWriter("TestFile.txt")) { // Add some text to the file. sw.Write("This is the "); sw.WriteLine("header for the file."); sw.WriteLine("-------------------"); // Arbitrary objects can also be written to the file. sw.Write("The date is: "); sw.WriteLine(DateTime.Now); } } }
C#
using System; using System.IO; public class TextToFile { private const string FILE_NAME = "MyFile.txt"; public static void Main(String[] args) { if (File.Exists(FILE_NAME)) { Console.WriteLine("{0} already exists.", FILE_NAME); return; } using (StreamWriter sw = File.CreateText(FILE_NAME)) { sw.WriteLine ("This is my file."); sw.WriteLine ("I can write ints {0} or floats {1}, and so on.", 1, 4.2); sw.Close(); } } }
Como: Ler texto de um arquivo Os exemplos de cdigo a seguir mostram como ler texto de um arquivo de texto. O segundo exemplo notifica voc quando o final do arquivo for detectado. Do ReadAllLines essa funcionalidade tambm pode ser obtida usando ou ReadAllText mtodos. Exemplo C#
using System; using System.IO; class Test { public static void Main() { try { // Create an instance of StreamReader to read from a file. // The using statement also closes the StreamReader. using (StreamReader sr = new StreamReader("TestFile.txt")) { String line; // Read and display lines from the file until the end of // the file is reached. while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } } catch (Exception e) { // Let the user know what went wrong. Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); } } }
C#
using System; using System.IO; public class TextFromFile { private const string FILE_NAME = "MyFile.txt"; public static void Main(String[] args) { if (!File.Exists(FILE_NAME)) { Console.WriteLine("{0} does not exist.", FILE_NAME); return; } using (StreamReader sr = File.OpenText(FILE_NAME)) { String input; while ((input=sr.ReadLine())!=null) { Console.WriteLine(input); } Console.WriteLine ("The end of the stream has been reached."); sr.Close(); } }
Programao robusta
Visual C# Consolidado
455
Este cdigo cria um StreamReader que aponta para MyFile.txt por meio de uma chamada para File.OpenText. Retorna StreamReader.ReadLine cada linha como uma seqncia. Quando no houver nenhum mais caracteres para ler, uma mensagem exibida com essa informao, e o fluxo est fechado. Observao Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo objeto My.Computer.FileSystem para a E/s de arquivos. Para obter mais informaes, consulte Objeto My.Computer.FileSystem. Como Ler Caracteres de uma Seqncia de Caracteres O exemplo de cdigo a seguir permite que voc a ler um determinado nmero de caracteres uma seqncia existente, comeando no local especificado na seqncia. Use StringReader para fazer isso, conforme demonstrado abaixo. Este cdigo define uma seqncia e converte-para uma matriz de caracteres, que ento pode ser lido pelo utilizando o mtodo apropriado StringReader.Read. Este exemplo l apenas o nmero especificado de caracteres da seqncia, da seguinte maneira.
Some number o
Exemplo C#
using System; using System.IO; public class CharsFromStr { public static void Main(String[] args) { // Create a string to read characters from. String str = "Some number of characters"; // Size the array to hold all the characters of the string // so that they are all accessible. char[] b = new char[24]; // Create an instance of StringReader and attach it to the string. StringReader sr = new StringReader(str); // Read 13 characters from the array that holds the string, starting // from the first array member. sr.Read(b, 0, 13); // Display the output. Console.WriteLine(b); // Close the StringReader. sr.Close(); } }
Como Escrever Caracteres em uma Seqncia de Caracteres O exemplo de cdigo a seguir grava um determinado nmero de caracteres de uma matriz de caracteres em uma seqncia existente, comeando no local especificado na matriz. Use StringWriter para fazer isso, conforme demonstrado abaixo. Exemplo C#
using System; using System.IO; using System.Text; public class CharsToStr { public static void Main(String[] args) { // Create an instance of StringBuilder that can then be modified. StringBuilder sb = new StringBuilder("Some number of characters"); // Define and create an instance of a character array from which // characters will be read into the StringBuilder. char[] b = {' ','t','o',' ','w','r','i','t','e',' ','t','o','.'}; // Create an instance of StringWriter // and attach it to the StringBuilder. StringWriter sw = new StringWriter(sb); // Write three characters from the array into the StringBuilder. sw.Write(b, 0, 3); // Display the output. Console.WriteLine(sb); // Close the StringWriter. sw.Close(); } }
Visual C# Consolidado
456
Programao robusta Este exemplo ilustra o uso do para modificar uma seqncia existente. um StringBuilder Observe que isso requer uma declarao adicional using, como a StringBuilder classe um membro do espao para nome System.Text. Alm disso, em vez de definir uma seqncia e convert-la em uma matriz de caracteres, este um exemplo de criar uma matriz de caractere diretamente e inicializando ele. Esse cdigo produz o seguinte resultado.
Some number of characters to
Como Adicionar ou Remover Entradas da Lista de Controle de Acesso Para adicionar ou remover entradas controle acesso (ACL) Lista para ou de um arquivo, ou DirectorySecurity Objeto deve ser obtido o arquivo ou pasta, modificado, e aplicados novamente ao arquivo ou pasta.. o FileSecurity Para adicionar ou remover uma entrada ACL de um arquivo 1. 2. 3. 1. 2. 3. Chame o GetAccessControl mtodo para obter um FileSecurity objeto que contm as entradas ACL atuais de um arquivo. Adicionar ou remover entradas ACL do objeto FileSecurity retornado da etapa 1. Passar o FileSecurity objeto para o SetAccessControl mtodo para aplicar as alteraes. Chame o GetAccessControl mtodo para obter um DirectorySecurity objeto que contm as entradas ACL atuais de uma pasta. Adicionar ou remover entradas ACL do objeto DirectorySecurity retornado da etapa 1. Passar o DirectorySecurity objeto para o SetAccessControl mtodo para aplicar as alteraes.
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
Uso Cria uma seqncia formatada de um conjunto de objetos de entrada. Cria seqncias de dois ou mais seqncias. Cria uma nova seqncia, combinando uma matriz de seqncias. Cria uma nova seqncia inserindo uma seqncia no ndice especificado de uma seqncia existente. Cpias especificado caracteres em uma seqncia em uma posio especificada de caracteres em uma matriz.
O exemplo anterior exibe o texto ' Your dog has 12 fleas. It is time to get a flea collar. The current universal date is: 2001-04-10 15:51:24Z.. ' para o console Exibe DateTime.Now a data atual e tempo de uma maneira especificada pela cultura associada a segmento atual. Concat O String.Concat mtodo pode ser usado para facilmente criar um novo objeto seqncia de caracteres de dois ou mais objetos existentes. Ele fornece uma forma independente de linguagem para concatenar seqncias. Esse mtodo aceita qualquer classe que deriva de System.Object. O exemplo a seguir cria uma seqncia de dois objetos de seqncia e um caractere separating.
Visual C# Consolidado
458
C#
string MyString = "Hello"; string YourString = "World!"; Console.WriteLine(String.Concat(MyString, ' ', YourString));
Esse cdigo exibe Hello World! para o console. Ingressar O String.Join mtodo cria uma nova seqncia de uma matriz de seqncias e uma seqncia de caracteres separadores. Esse mtodo til se voc desejar concatenar vrias seqncias juntos, fazer uma lista talvez separada por uma vrgula. O exemplo a seguir usa um espao para vincular uma matriz de seqncia de caracteres. C#
string[] MyString = {"Hello", "and", "welcome", "to", "my" , "world!"}; Console.WriteLine(String.Join(" ", MyString));
Esse cdigo exibe Hello and welcome to my world! para o console. Inserir O String.Insert mtodo cria uma nova seqncia inserindo uma seqncia em uma posio na outra seqncia especificada. Esse mtodo usa um ndice com base zero. O exemplo a seguir insere uma seqncia no quinta a posio do MyString ndice e cria uma nova seqncia com esse valor. C#
string MyString = "Once a time."; Console.WriteLine(MyString.Insert(4, " upon"));
Esse cdigo exibe Once upon a time. para o console. CopyTo O String.CopyTo mtodo copia partes de uma seqncia em uma matriz de caracteres. Voc pode especificar os dois ndice Incio da seqncia e o nmero de caracteres a serem copiados. Este mtodo utiliza o ndice fonte, uma matriz de caracteres, o ndice de destino, e o nmero de caracteres para copiar. Todos os ndices so baseada em zero. O exemplo a seguir usa o CopyTo mtodo para copiar os caracteres da palavra " Hello " de um objeto de seqncia para a primeira posio de ndice de uma matriz de caracteres. C#
string MyString = "Hello World!"; char[] MyCharArray = {'W','h','e','r','e'}; Console.WriteLine("The original character array: {0}", MyCharArray); MyString.CopyTo(0, MyCharArray,0 ,5); Console.WriteLine("The new character array: {0}", MyCharArray);
Visual C# Consolidado
459
Uso Remove espaos em branco de incio e no fim de uma seqncia. Remove caracteres especificados em uma matriz de caracteres a partir do final de uma seqncia. Remove caracteres especificados em uma matriz de caracteres de incio de uma seqncia. Remove um nmero especificado de caracteres de uma posio ndice especificado na seqncia.
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);
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));
Uso
Visual C# Consolidado
461
Alinha direita e PADS uma seqncia para que seja uma distncia especificada a partir do incio da seqncia seu caractere mais direita. Alinha esquerda e PADS uma seqncia para que seja uma distncia especificada a partir do final de seqncia seu caractere mais direita.
O String.PadLeft mtodo cria uma nova seqncia que alinhado direita para que o ltimo caractere seja um nmero de espaos do primeiro ndice da seqncia especificado. Espaos em branco so inseridos se voc no usar uma substituio que permite que voc se especificar seu prprio caractere de preenchimento personalizada. O exemplo a seguir usa o PadLeft mtodo para criar uma nova seqncia que tenha um comprimento total de vinte espaos. C#
string MyString = "Hello World!"; Console.WriteLine(MyString.PadLeft(20, '-'));
Este exemplo exibe --------Hello World! para o console. PadRight O String.PadRight mtodo cria uma nova seqncia que alinhado esquerda para que a seqncia atual ser estendida especificado um nmero de espaos para a direita do primeiro ndice a seqncia na. Esse mtodo preenche a nova seqncia com espaos em branco se voc no especificar um caractere personalizado. O exemplo a seguir usa o PadRight mtodo para criar uma nova seqncia que tenha um comprimento total de vinte espaos. C#
string MyString = "Hello World!"; Console.WriteLine(MyString.PadRight(20, '-'));
String.CompareOrdinal Compara duas seqncias sem considerar a cultura local. Retorna um valor inteiro. String.CompareTo String.StartsWith String.EndsWith Compara o objeto de seqncia atual outra seqncia. Retorna um valor inteiro. Determina se uma seqncia comea com a seqncia passada. Retorna um valor booleano. Determina se uma seqncia termina com a seqncia passada. Retorna
Visual C# Consolidado
462
um valor booleano. String.Equals String.IndexOf Determina se duas seqncias so os mesmos. Retorna um valor booleano. Retorna a posio de ndice de um caractere ou seqncia, comeando a partir do incio da seqncia voc est examinando. Retorna um valor inteiro. Retorna a posio de ndice de um caractere ou seqncia, comeando a partir do final de seqncia voc est examinando. Retorna um valor inteiro.
String.LastIndexOf
Compare O String.Compare mtodo fornece uma maneira completa de comparar o objeto de seqncia atual para outro objeto ou seqncia. Esse mtodo culturally ciente. Voc pode usar esta funo para comparar dois seqncias ou substrings de duas seqncias. Alm disso, overloads so fornecidos que considerar ou Ignorar maisculas e culturais varincia. A tabela a seguir mostra valores inteiros trs que podem ser retornados por esse mtodo. Tipo de valor Um inteiro negativo 0 Um inteiro positivo Ou1 Condio strA menor que strB. igual a strAstrB. Esta instncia maior que value. Ou value uma referncia nula (Nothing no Visual Basic.)
O exemplo a seguir usa o Compare mtodo para determinar os valores das duas seqncias relativos. C#
string MyString = "Hello World!"; Console.WriteLine(String.Compare(MyString, "Hello World?"));
Este exemplo exibe -1 para o console. O exemplo anterior confidenciais culture-por padro. Para executar uma comparao de seqncia culture-insensitive, use uma sobrecarga do String.Compare mtodo que permite que voc para especificar a cultura para usar, fornecendo um culture parmetro. Para obter um exemplo que demonstra como usar o String.Compare mtodo para realizar uma comparao culture-insensitive, consulte Executar Comparisons String Insensitive Culture-. CompareOrdinal O String.CompareOrdinal mtodo compara dois objetos de seqncia sem considerar a cultura local. Os valores de retorno desse mtodo so idnticos aos valores retornados pelo mtodo Compare na tabela anterior. O exemplo a seguir usa o CompareOrdinal mtodo para comparar os valores das duas seqncias. C#
string MyString = "Hello World!"; Console.WriteLine(String.CompareOrdinal(MyString, "hello world!"));
Visual C# Consolidado
463
Este exemplo exibe -32 para o console. CompareTo O String.CompareTo mtodo compara a seqncia que o objeto de seqncia atual encapsula a outro seqncia ou objeto. Os valores de retorno desse mtodo so idnticos aos valores retornados pelo mtodo Compare na tabela anterior. O exemplo a seguir usa o CompareTo mtodo para comparar o MyString objeto do OtherString objeto. C#
String MyString = "Hello World"; String OtherString = "Hello World!"; int MyInt = MyString.CompareTo(OtherString); Console.WriteLine( MyInt );
Este exemplo exibe 1 para o console. Todos os overloads do mtodo String.CompareTo executar comparaes confidenciais culture-e maisculas de minsculas por padro. Nenhum overloads desse mtodo so fornecidos que permitem a voc para realizar uma comparao insensitive culture-. Para maior clareza de cdigo, recomendvel que voc utilize o String.Compare mtodo em vez disso, especificando CultureInfo.CurrentCulture para operaes confidenciais culture-ou CultureInfo.InvariantCulture para operaes insensitive culture-. Para obter exemplos que demonstram como usar o String.Compare mtodo para realizar comparaes confidenciais culture-e-insensitive culture, consulte Executar Comparisons String Insensitive Culture-. Igual a O String.Equals mtodo facilmente pode determinar se duas seqncias so os mesmos. Maisculas de Minsculas esse mtodo retorna um true ou false boolean valor. Pode ser usado de uma classe existente, conforme ilustrado no exemplo a seguir. O exemplo a seguir usa o Equals mtodo para determinar se um objeto de seqncia contm a frase " Hello World ". C#
string MyString = "Hello World"; Console.WriteLine(MyString.Equals("Hello World"));
Este exemplo exibe True para o console. Esse mtodo tambm pode ser usado como um mtodo esttico. O exemplo a seguir compara dois objetos de seqncia usando um mtodo esttico. C#
string MyString = "Hello World"; string YourString = "Hello World"; Console.WriteLine(String.Equals(MyString, YourString));
Este exemplo exibe True para o console. StartsWith e EndsWith Voc pode utilizar o String.StartsWith mtodo para determinar se um objeto de seqncia comea com os mesmos caracteres que abranger outra seqncia. Esse mtodo maisculas de minsculas retorna true se o objeto de seqncia atual comea com a seqncia passada e false
Visual C# Consolidado
464
se no estiver. O exemplo a seguir usa esse mtodo para determinar se um objeto de seqncia comea com " Hello ". C#
string MyString = "Hello World"; Console.WriteLine(MyString.StartsWith("Hello"));
Este exemplo exibe True para o console. O String.EndsWith mtodo Compara uma seqncia passada para os caracteres que existem no final da seqncia o objeto atual. Ele tambm retorna um valor booleano. O exemplo a seguir verifica o fim de uma seqncia usando o EndsWith mtodo. C#
string MyString = "Hello World"; Console.WriteLine(MyString.EndsWith("Hello"));
Este exemplo exibe False para o console. IndexOf e LastIndexOf Voc pode usar o String.IndexOf mtodo para determinar a posio da primeira ocorrncia de um caractere especfico dentro de uma seqncia. Este mtodo maisculas de minsculas inicia contagem do incio de uma seqncia e retorna a posio de um caractere utilizando um ndice com base zero passado. Se o caractere no puder ser encontrado, um valor de 1 retornado. O exemplo a seguir usa o IndexOf mtodo para procurar a primeira ocorrncia da. ' l ' caracteres em uma seqncia C#
string MyString = "Hello World"; Console.WriteLine(MyString.IndexOf('l'));
Este exemplo exibe 2 para o console. O String.LastIndexOf mtodo semelhante ao mtodo String.IndexOf exceto que ela retorna a posio da ltima ocorrncia de um caractere especfico dentro de uma seqncia. Ele diferencia maisculas de minsculas e usa um ndice com base zero. O exemplo a seguir utiliza o LastIndexOf mtodo para pesquisar para a ltima ocorrncia da. ' l ' caracteres em uma seqncia C#
string MyString = "Hello World"; Console.WriteLine(MyString.LastIndexOf('l'));
Este exemplo exibe 9 para o console. Ambos os mtodos so teis quando usada em conjunto com o String.Remove mtodo. Voc pode usar um ou LastIndexOf Mtodos para recuperar a posio do caractere, e fornea naquela posio para o Remove mtodo para remover um caractere ou uma palavra que comece com esse caractere. o IndexOf
Visual C# Consolidado
465
Alterando a Caixa
Se voc escrever um aplicativo que aceita entrada de um usurio, nunca pode certificar-que caso ele ou ela usar para inserir os dados. Como os mtodos que comparam seqncias e caracteres diferenciam maisculas de minsculas, voc deve converter caso de seqncias de caracteres inseridos pelos usurios antes comparando-os em valores constantes. Voc pode alterar facilmente caso de uma seqncia. A tabela a seguir descreve dois mtodos alterao caso. Cada mtodo fornece uma substituio que aceita uma cultura. Nome do mtodo String.ToUpper String.ToLower ToUpper O String.ToUpper mtodo altera todos os caracteres em uma seqncia em maisculas. O exemplo seguinte converte a seqncia " World hello! de " Misto caso em maisculo. C#
String MyString = "Hello World!"; Console.WriteLine(MyString.ToUpper());
Uso Converte todos os caracteres em uma seqncia em maisculas. Converte todos os caracteres em uma seqncia em minsculas.
Este exemplo exibe HELLO WORLD! para o console. O exemplo anterior confidenciais culture-por padro. Para executar uma alterao caso cultureinsensitive, use uma sobrecarga do String.Upper mtodo que permite que voc para especificar a cultura para usar, fornecendo um culture parmetro. Para obter um exemplo que demonstra como usar o String.Upper mtodo para executar uma alterao caso culture-insensitive, consulte Executar alteraes caso Insensitive Culture-. ToLower O String.ToLower mtodo semelhante ao mtodo anterior, mas em vez disso converte todos os caracteres em uma seqncia para minsculas. O exemplo a seguir converte a seqncia " World hello! " em minsculas. C#
String MyString = "Hello World!"; Console.WriteLine(MyString.ToLower());
Este exemplo exibe hello world! para o console. O exemplo anterior confidenciais culture-por padro. Para executar uma alterao caso cultureinsensitive, use uma sobrecarga do String.Lower mtodo que permite que voc para especificar a cultura para usar, fornecendo um culture parmetro. Para obter um exemplo que demonstra como usar o String.Lower mtodo para executar uma alterao caso culture-insensitive, consulte Executar alteraes caso Insensitive Culture-.
Visual C# Consolidado
466
Definir a capacidade e comprimento Embora voc pode especificar um valor para o nmero mximo de caracteres que pode conter. um objeto dinmico que permite que voc para expandir o nmero de caracteres na seqncia que ele encapsula, o StringBuilder Esse valor chamada a capacidade do objeto e no deve ser confundido com o comprimento da seqncia de caracteres que mantm o atual StringBuilder. Por exemplo, voc pode criar uma nova instncia da classe StringBuilder com a seqncia " Al ", que possui um comprimento de 5, e voc pode especificar que ele tiver a capacidade mxima de 25. Quando voc modificar ele no no realocar tamanho para si at que a capacidade seja alcanada. o StringBuilder, Quando isso ocorrer, o novo espao distribudo automaticamente e a capacidade duplicada. Voc pode especificar a capacidade da StringBuilder classe usando um dos construtores sobrecarregados. O exemplo a seguir especifica que o MyStringBuilder objeto pode ser expandido para um mximo de 25 espaos. C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);
Alm disso, voc pode usar a leitura / gravar Capacidade propriedade para definir o tamanho mximo do objeto. O exemplo a seguir usa a Capacity propriedade para definir o comprimento mximo de objeto. C#
MyStringBuilder.Capacity = 25;
O EnsureCapacity mtodo pode ser usado para verificar a capacidade do atual StringBuilder. Se a capacidade for maior que o valor passado, nenhuma alterao feita; no entanto, se a capacidade for menor que o valor passado, a capacidade atual alterada para corresponder o valor passado. A Comprimento propriedade pode tambm ser exibido ou definido. Se voc definir a Length propriedade para um valor que maior que a Capacity propriedade, a Capacity propriedade automaticamente alterada para o mesmo valor que a Length propriedade. A configurao da Length propriedade para um valor que menor que o comprimento da seqncia de caracteres dentro da atual StringBuilder diminui a seqncia. Modificar a seqncia de caracteres StringBuilder
Visual C# Consolidado
467
A tabela a seguir lista os mtodos que podem ser usados para modificar o contedo de um StringBuilder. Nome do mtodo StringBuilder.Append Uso Acrescenta informaes ao final do atual StringBuilder.
StringBuilder.AppendFormat Substitui um especificador de formato passado em uma seqncia com texto formatado. StringBuilder.Insert Insere uma seqncia ou objeto para o ndice especificado do atual StringBuilder. Remove um nmero especificado de caracteres da atual StringBuilder. Substitui um caractere especificado em um ndice especificado.
StringBuilder.Remove
StringBuilder.Replace Acrescentar
O Append mtodo pode ser usado para adicionar texto ou uma representao seqncia de um objeto ao final de uma seqncia representada por atual StringBuilder. O exemplo a seguir inicializa e ento acrescenta algum texto para o final do objeto. Para " Hello World " um StringBuilder Espao em alocado automaticamente conforme necessrio. C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Append(" What a beautiful day."); Console.WriteLine(MyStringBuilder);
Este exemplo exibe Hello World! What a beautiful day. para o console.
AppendFormat
Do Formatao seo o AppendFormat mtodo adiciona texto ao final do StringBuilder, mas tambm implementa a IFormattable interface e portanto aceita as seqncias Formato padro descritas em. Voc pode usar esse mtodo para personalizar o formato de variveis e acrescentar esses valores para um StringBuilder. O exemplo a seguir utiliza o AppendFormat mtodo para colocar um valor inteiro formatado como um valor de moeda no final de um StringBuilder. C#
int MyInt = 25; StringBuilder MyStringBuilder = new StringBuilder("Your total is "); MyStringBuilder.AppendFormat("{0:C} ", MyInt); Console.WriteLine(MyStringBuilder);
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);
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);
Replace
O Replace mtodo pode ser usado para substituir caracteres dentro do StringBuilder objeto com outro caractere especificado. O exemplo a seguir usa o Replace mtodo para localizar um StringBuilder objeto para todas as ocorrncias do caractere ponto de exclamao (!) e substituilos com o caractere ponto de interrogao (?). C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Replace('!', '?'); Console.WriteLine(MyStringBuilder);
Este exemplo exibe Hello World? para o console. Como Executar Manipulaes sobre Seqncia de Caracteres Usando Operaes Bsicas O exemplo a seguir usa alguns dos mtodos discutidos nos tpicos Bsico operaes String para construir uma classe que executa manipulations de seqncia de uma maneira que pode ser encontrada em um aplicativo do mundo real. A MailToData classe armazena o nome e endereo de uma pessoa em propriedades separadas e fornece uma maneira para combinar o City, State., e Zip campos em uma nica seqncia para exibio para o usurio Alm disso, a classe permite ao usurio para inserir a cidade, estado, e informaes cdigo postal como uma nica seqncia; o aplicativo analisa a seqncia de caracteres nica e insere as informaes adequadas na propriedade correspondente automaticamente. Para simplificar, este exemplo usa um aplicativo de console com uma interface de linha de comando. Exemplo C#
using System; class MainClass { static void Main(string[] args) { MailToData MyData = new MailToData(); Console.Write("Enter Your Name:"); MyData.Name = Console.ReadLine(); Console.Write("Enter Your Address:"); MyData.Address = Console.ReadLine(); Console.Write("Enter Your City, State, and ZIP Code separated by spaces:"); MyData.CityStateZip = Console.ReadLine(); Console.WriteLine("Name: {0}",
Visual C# Consolidado
469
MyData.Name); Console.WriteLine("Address: {0}", MyData.Address); Console.WriteLine("City: {0}", MyData.City); Console.WriteLine("State: {0}", MyData.State); Console.WriteLine("Zip: {0}", MyData.Zip); Console.WriteLine("The following address will be used:"); Console.WriteLine(MyData.Address); Console.WriteLine(MyData.CityStateZip); } } public class MailToData { string name = " "; string address = " "; string citystatezip = " "; string city = " "; string state = " "; string zip = " "; public MailToData() { } public string Name { get{return name;} set{name = value;} } public string Address { get{return address;} set{address = value;} } public string CityStateZip { get { return ReturnCityStateZip(); } set { citystatezip = value; ParseCityStateZip(); } } public string City { get{return city;} set{city = value;} } public string State { get{return state;} set{state = value;} } public string Zip { get{return zip;} set{zip = value;} } private void ParseCityStateZip() { int CityIndex; int StateIndex; // Check for an exception if the user did not enter spaces between // the elements. try { // Find index position of the space between // city and state and assign that value to CityIndex. CityIndex = citystatezip.IndexOf(" "); // Initialize the CityArray to the value of the // index position of the first white space. char[] CityArray = new char[CityIndex]; // Copy the city to the CityArray. citystatezip.CopyTo(0,CityArray ,0, CityIndex); // Find index position of the space between // state and zip and assign that value to CityIndex. StateIndex = citystatezip.LastIndexOf(" "); // Initialize the StateArray to the length of the state. char[] StateArray = new char[StateIndex - CityIndex]; // Copy the state to the StateArray. citystatezip.CopyTo(CityIndex, StateArray, 0, (StateIndex - CityIndex)); // Initialize the ZipArray to the length of the zip. char[] ZipArray = new char[citystatezip.Length - StateIndex]; // Copy the zip to the ZipArray. citystatezip.CopyTo(StateIndex, ZipArray, 0, (citystatezip.Length - StateIndex)); // Assign city to the value of CityArray. city = new String(CityArray); // Trim white spaces, commas, and so on. city = city.Trim(new char[]{' ', ',', ';', '-', ':'}); // Assign state to the value of StateArray. state = new String(StateArray); // Trim white spaces, commas, and so on. state = state.Trim(new char[]{' ', ',', ';', '-', ':'}); // Assign zip to the value of ZipArray. zip = new String(ZipArray); // Trim white spaces, commas, and so on. zip = zip.Trim(new char[]{' ', ',', ';', '-', ':'}); } // If an exception is encountered, alert the user to enter spaces // between the elements. catch(OverflowException) { Console.WriteLine("\n\nYou must enter spaces between elements.\n\n"); } } private string ReturnCityStateZip() { // Make state uppercase. state = state.ToUpper(); // Put the value of city, state, and zip together in the proper manner. string MyCityStateZip = String.Concat(city, ", ", state, " ", zip); return MyCityStateZip; } }
Quando o cdigo anterior executado, o usurio solicitado a digitar sua prpria nome e endereo. O aplicativo coloca as informaes nas propriedades adequadas e exibe as informaes novamente para o usurio, criar uma nica seqncia que exibe a cidade, estado e CEP informaes. Como Converter Tipos de Dados Usando System.Convert A System.Convert classe fornece um conjunto completo de mtodos para converses com suporte. Ele fornece uma maneira idioma neutro para realizar converses e est disponvel para todos os idiomas que direcionar o Common Language Runtime. Enquanto idiomas diferentes podem ter tcnicas diferentes para converter tipos de dados, a Convert classe assegura que todas as converses comuns sero disponveis em um formato genrico. Esta classe executa converses restrio, bem como converses para tipos de dados no relacionadas. Por exemplo, converses de String tipos para tipos numricos, DateTime Tipos a String tipos, e String Tipos para Boolean tipos tm suporte. Do lista de mtodos para obter uma lista de converses disponveis, consulte na classe Convert. A Convert classe executa converses verificados e sempre gera uma exceo se no houver suporte para a converso. A exceo geralmente um OverflowException. Para obter uma lista de converses com suporte, consulte o Digite tabelas de converso.
Visual C# Consolidado
470
Voc pode passar o valor que voc deseja para converter em um dos mtodos apropriados na classe Convert e inicializar o valor retornado para uma nova varivel. Por exemplo, o cdigo a seguir usa a Convert classe para transformar um String valor em um Boolean valor. Exemplo C#
string MyString = "true"; bool MyBool = Convert.ToBoolean(MyString); // MyBool has the value of True.
A Convert classe tambm til se voc tiver uma seqncia que voc deseja converter em um valor numrico. O exemplo de cdigo a seguir converte uma seqncia de caracteres que contm caracteres numricos em um Int32 valor. C#
string newString = "123456789"; int MyInt = Convert.ToInt32(newString); // MyInt has the value of 123456789.
A Convert classe tambm pode ser usada para uma converso restrio que no pode ser executada implicitamente em voc estiver usando o idioma especfico. O exemplo de cdigo a seguir mostra uma converso de restrio em uma menor Int32 utilizando o Convert.ToInt32 Mtodo. um Int64 C#
Int64 MyInt64 = 123456789; int MyInt = Convert.ToInt32(MyInt64); // MyInt has the value of 123456789.
s vezes, executar uma converso restrio com as Convert alteraes de classe o valor do item est sendo convertido. O seguinte cdigo exemplo converte em um Int32 valor. um Double Nesse caso, o valor arredondado de 42.72 para 43 para concluir a converso. C#
Double MyDouble = 42.72; int MyInt = Convert.ToInt32(MyDouble); // MyInt has the value of 43.
Como Remover Caracteres Invlido de uma Seqncia de Caracteres O exemplo de cdigo a seguir usa o mtodo esttico Regex.Replace para tirar de uma seqncia caracteres invlidos. Voc pode usar o CleanInput mtodo definido aqui para retirar potencialmente prejudiciais caracteres que tiver sido inseridos em um campo Texto em um formulrio que aceita entrada do usurio. Retorna CleanInput uma seqncia aps stripping fora todos os caracteres exceto nonalphanumeric @, - (um trao), e. (um perodo). Exemplo C#
String CleanInput(string strIn) { // Replace invalid characters with empty strings. return Regex.Replace(strIn, @"[^\w\.@-]", ""); }
Como Verificar se Seqncias de Caracteres Esto em um Formato de Email Vlido O exemplo de cdigo a seguir usa o mtodo esttico Regex.IsMatch para verificar se uma seqncia est no formato de email vlido. O IsValidEmail mtodo retorna true Se a seqncia contm um endereo de email vlido e false se ele no estiver, mas leva nenhuma outra ao. Voc pode usar IsValidEmail Para filtrar sem endereos de email que contm caracteres invlidos
Visual C# Consolidado
471
antes o aplicativo armazena os endereos em um banco de dados ou exibe-os em uma pgina ASP.NET. Exemplo C#
bool IsValidEmail(string strIn) { // Return true if strIn is in valid e-mail format. return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); }
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.
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.
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.
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
Voc precisa uma lista seqencial onde o elemento normalmente ser descartado aps seu valor recuperado? Caso afirmativo, considere o uso da Queue classe ou a Queue classe genrica se voc precisar comportamento (FIFO) primeiro First-In--fora. Considere o uso da Stack classe ou a Stack classe genrica se voc precisar comportamento (LIFO) ltima in primeiro-Out. Caso contrrio, considere usar as outras colees. Voc precisa acessar os elementos em uma determinada ordem, tais como FIFO, LIFO, ou aleatrios? A Queue classe e a Queue classe genrica oferece acesso fifo. A Stack classe e a Stack classe genrica oferece acesso LIFO. A LinkedList classe genrico permite acesso seqencial originados do topo para o final ou o final para a cabea de. O restante das colees oferecem acesso aleatrio. Voc precisa acessar cada elemento pelo ndice? O ArrayList e StringCollection Classes e a List classe genrica oferecem acesso a seus elementos pelo ndice baseado em zero do elemento. O Hashtable, SortedList e SortedDictionary Classes genricos oferecem acesso a seus elementos pela chave do elemento., ListDictionary e StringDictionary classes, e o Dictionary O NameObjectCollectionBase e SortedList Classes genricos oferecem acesso a seus elementos por um o ndice baseado em zero ou a chave do elemento. e NameValueCollection classes, e o KeyedCollection Cada elemento ir conter um valor, uma combinao de uma chave e um valor, ou uma combinao de uma chave e vrios valores? Um valor: usar qualquer um das colees com base na IList interface ou a IList interface genrica. Uma chave e um valor: usar qualquer um das colees com base na IDictionary interface ou a IDictionary interface genrica. Um valor com chave incorporado: usar a KeyedCollection classe genrica. Uma chave e vrios valores: usar a NameValueCollection classe. Voc precisa classificar os elementos de forma diferente de como eles foram inseridos? A Hashtable classe classifica seus elementos por seus cdigos hash. A SortedList classe com base em implementaes de interface IComparer e a IComparer interface genrica. e SortedDictionary e SortedList Classes genricos classificar seus elementos atravs da tecla, Fornece ArrayList um Sort mtodo que leva uma IComparer Implementao como um parmetro. Sua contraparte genrico, a List classe genrica, fornece um Sort mtodo que leva uma implementao da interface IComparer como um parmetro genrico. Voc precisa pesquisas rpidas e recuperao de informaes?
o o o o o o o
o o o o o o
Visual C# Consolidado
476
ListDictionary mais rpido do que Hashtable para colees pequenos (10 itens ou menos). A SortedDictionary classe genrico oferece pesquisa mais rpida que a Dictionary classe genrica. Voc precisa colees que aceitam somente seqncias? (StringCollection). com base em IList e StringDictionary (com base em IDictionary) esto no espao para nome System.Collections.Specialized Alm disso, voc pode usar qualquer uma das classes a coleo genrica no espao para nome System.Collections.Generic como colees de seqncia de tipo forte, especificando a String classe para seus argumentos tipo genrico.
o o
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.
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,
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.
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.
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
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
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.
Observao Um Designer (tais como Visual Studio 2005) ser fazer esta Cabeamento de evento para voc, gerando cdigo que semelhante ao cdigo, neste exemplo. Exemplo O exemplo de cdigo a seguir manipula o Click evento de para alterar a cor de TextBox Plano de Fundo. um Button Mostrar os elementos em negrito o manipulador de eventos e como ele cabeado para o Click evento do Button. O cdigo, neste exemplo foi escrito sem usar um criador visual (tais como Visual Studio 2005) e contm somente essenciais elementos de programao. Se voc usar um designer, ele ir gerar cdigo adicional. C#
using System; using System.ComponentModel; using System.Windows.Forms; using System.Drawing; public class MyForm : Form { private TextBox box; private Button button; public MyForm() : base() { box = new TextBox(); box.BackColor = System.Drawing.Color.Cyan; box.Size = new Size(100,100); box.Location = new Point(50,50); box.Text = "Hello"; button = new Button(); button.Location = new Point(50,100); button.Text = "Click Me"; // To wire the event, create // a delegate instance and add it to the Click event. button.Click += new EventHandler(this.Button_Clicked); Controls.Add(box); Controls.Add(button); } // The event handler. private void Button_Clicked(object sender, EventArgs e) { box.BackColor = System.Drawing.Color.Green; }
Visual C# Consolidado
489
// The STAThreadAttribute indicates that Windows Forms uses the // single-threaded apartment model. [STAThreadAttribute] public static void Main(string[] args) { Application.Run(new MyForm()); } } Option Explicit Option Strict Imports System Imports System.ComponentModel Imports System.Windows.Forms Imports System.Drawing Public Class MyForm Inherits Form Private box As TextBox Private WithEvents myButton As Button Public Sub New() box = New TextBox() box.BackColor = System.Drawing.Color.Cyan box.Size = New Size(100, 100) box.Location = New Point(50, 50) box.Text = "Hello" myButton = New Button() myButton.Location = New Point(50, 100) myButton.Text = "Click Me" AddHandler myButton.Click, AddressOf Me.Button_Clicked Controls.Add(box) Controls.Add(myButton) End Sub ' The event handler. Private Sub Button_Clicked(sender As Object, e As EventArgs) box.BackColor = System.Drawing.Color.Green End Sub ' The STAThreadAttribute indicates that Windows Forms uses the ' single-threaded apartment model. <STAThreadAttribute()> _ Public Shared Sub Main(args() As String) Application.Run(New MyForm()) End Sub End Class
Compilando o cdigo Salvar o cdigo anterior em um arquivo com (uma extenso. cs) para um arquivo C# e.vb para Visual Basic 2005, compilar, e executar. Por exemplo, se o arquivo de origem for denominado WinEvents.cs (ou WinEvents.vb), execute o seguinte comando: C#
csc /r:System.DLL /r:System.Windows.Forms.DLL /r:System.Drawing.DLL WinEvents.cs vbc /r:System.DLL /r:System.Windows.Forms.DLL /r:System.Drawing.DLL WinEvents.vb
Seu arquivo executvel ser denominado WinEvents.exe. Como Conectar Mtodos de Manipulao de Eventos a Eventos Para consumir eventos definidos na outra classe, voc deve definir e registrar um manipulador de eventos. O manipulador de eventos deve ter a mesma assinatura mtodo como o representante declarado para o evento. Registrar o manipulador de eventos, adicionando o manipulador ao evento. Aps ter adicionado o manipulador de eventos para o evento, o mtodo chamado sempre que a classe gera o evento. Para um exemplo completo que ilustra eventos raising e Handling, consulte Como aumentar e Consume eventos:. Para adicionar um mtodo do manipulador de eventos para um evento 1. Definir um mtodo do manipulador de eventos com a mesma assinatura como o representante de evento. C#
public class WakeMeUp { // AlarmRang has the same signature as AlarmEventHandler. public void AlarmRang(object sender, AlarmEventArgs e) {...}; ... }
2.
Criar uma instncia do representante, usando uma referncia para o mtodo do manipulador de eventos. Quando a instncia de representante chamada, ele por sua vez chama o mtodo do manipulador de eventos. C#
Visual C# Consolidado
490
// Create an instance of WakeMeUp. WakeMeUp w = new WakeMeUp(); // Instantiate the event delegate. AlarmEventHandler alhandler = new AlarmEventHandler(w.AlarmRang);
3.
Adicione a instncia de representante para o evento. Quando o evento gerado, a instncia de representante e seu mtodo do manipulador de evento associado chamado. C#
// Instantiate the event source. AlarmClock clock = new AlarmClock(); // Add the delegate instance to the event. clock.Alarm += alhandler;
O seguinte programa exemplo demonstra elevar um evento em uma classe e manipular o evento no outra classe. A AlarmClock classe define o evento Alarm pblico, e fornece mtodos para aumentar o evento. A AlarmEventArgs classe derivada da EventArgs e define os dados especficos a um Alarm evento. A WakeMeUp classe define o mtodo AlarmRang, que trata um Alarm evento. A AlarmDriver classe usa as classes juntos, como o AlarmRang Mtodo de WakeMeUp manipular o Alarm evento do AlarmClock. Este programa exemplo usa conceitos descritos com detalhes no Eventos e representantes e Elevar um evento. Exemplo C#
// EventSample.cs. // namespace EventSample { using System; using System.ComponentModel; // Class that contains the data for // the alarm event. Derives from System.EventArgs. // public class AlarmEventArgs : EventArgs { private readonly bool snoozePressed ; private readonly int nrings; //Constructor. // public AlarmEventArgs(bool snoozePressed, int nrings) { this.snoozePressed = snoozePressed; this.nrings = nrings; } // The NumRings property returns the number of rings // that the alarm clock has sounded when the alarm event // is generated. // public int NumRings { get { return nrings;} } // The SnoozePressed property indicates whether the snooze // button is pressed on the alarm when the alarm event is generated. // public bool SnoozePressed { get {return snoozePressed;} } // The AlarmText property that contains the wake-up message. // public string AlarmText { get { if (snoozePressed) { return ("Wake Up!!! Snooze time is over."); } else { return ("Wake Up!"); } } } } // Delegate declaration. // public delegate void AlarmEventHandler(object sender, AlarmEventArgs e); // The Alarm class that raises the alarm event. // public class AlarmClock { private bool snoozePressed = false; private int nrings = 0; private bool stop = false; // The Stop property indicates whether the // alarm should be turned off. // public bool Stop { get {return stop;} set {stop = value;} } // The SnoozePressed property indicates whether the snooze // button is pressed on the alarm when the alarm event is generated. // public bool SnoozePressed { get {return snoozePressed;} set {snoozePressed = value;} } // The event member that is of type AlarmEventHandler. // public event AlarmEventHandler Alarm; // The protected OnAlarm method raises the event by invoking // the delegates. The sender is always this, the current instance // of the class. // protected virtual void OnAlarm(AlarmEventArgs e) { AlarmEventHandler handler = Alarm; if (handler != null) { // Invokes the delegates. handler(this, e); } } // This alarm clock does not have // a user interface. // To simulate the alarm mechanism it has a loop // that raises the alarm event at every iteration // with a time delay of 300 milliseconds, // if snooze is not pressed. If snooze is pressed, // the time delay is 1000 milliseconds. // public void Start() { for (;;) { nrings++; if (stop) { break; } else if (snoozePressed) { System.Threading.Thread.Sleep(1000); { AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings); OnAlarm(e); } } else { System.Threading.Thread.Sleep(300); AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings); OnAlarm(e); } } } } // The WakeMeUp class has a method AlarmRang that handles the // alarm event. // public class WakeMeUp { public void AlarmRang(object
Visual C# Consolidado
491
sender, AlarmEventArgs e) { Console.WriteLine(e.AlarmText +"\n"); if (!(e.SnoozePressed)) { if (e.NumRings % 10 == 0) { Console.WriteLine(" Let alarm ring? Enter Y"); Console.WriteLine(" Press Snooze? Enter N"); Console.WriteLine(" Stop Alarm? Enter Q"); String input = Console.ReadLine(); if (input.Equals("Y") ||input.Equals("y")) return; else if (input.Equals("N") || input.Equals("n")) { ((AlarmClock)sender).SnoozePressed = true; return; } else { ((AlarmClock)sender).Stop = true; return; } } } else { Console.WriteLine(" Let alarm ring? Enter Y"); Console.WriteLine(" Stop Alarm? Enter Q"); String input = Console.ReadLine(); if (input.Equals("Y") || input.Equals("y")) return; else { ((AlarmClock)sender).Stop = true; return; } } } } // The driver class that hooks up the event handling method of // WakeMeUp to the alarm event of an Alarm object using a delegate. // In a forms-based application, the driver class is the // form. // public class AlarmDriver { public static void Main (string[] args) { // Instantiates the event receiver. WakeMeUp w= new WakeMeUp(); // Instantiates the event source. AlarmClock clock = new AlarmClock(); // Wires the AlarmRang method to the Alarm event. clock.Alarm += new AlarmEventHandler(w.AlarmRang); clock.Start(); } } }
Como Manipular Vrios Eventos Usando Propriedades de Evento Para usar propriedades de evento em Visual Basic 2005 (eventos personalizados), voc definir as propriedades de evento na classe que aumenta os eventos, e defina os delegados para as propriedades de evento em classes que manipular os eventos. Para implementar vrias propriedades de evento em uma classe, deve a classe internamente armazenar e manter o representante definido para cada evento. Uma abordagem comum para implementar uma coleo de representante que indexada por uma chave de evento. Para armazenar os delegados para cada evento, voc pode usar a EventHandlerList classe, ou implementar sua prpria coleo A classe coleo deve fornecer mtodos para definir, acessando, e recuperar o representante do manipulador de eventos de acordo com a chave de evento. Por exemplo, voc pode usar uma Tabela de hash classe, ou derivar uma classe personalizada de classe DictionaryBase. Os detalhes da implementao da coleo de representante no precisar ser expostos fora sua classe. Cada propriedade de evento dentro da classe define um mtodo de assessor Add e um mtodo de assessor remover. O acessador de adio para uma propriedade de evento adiciona a instncia de representante entrada coleo de representante. O acessador remover para uma propriedade de evento remove a instncia de representante entrada da coleo de representante. As assessores propriedade de evento usar a chave predefinida para a propriedade de evento para adicionar e remover instncias de uma coleo de representante. Para manipular vrios eventos usando propriedades de evento 1. 2. 3. 4. 5. Definir uma coleo de representante dentro da classe que gera os eventos. Defina uma chave para cada evento. Definir as propriedades de evento na classe que gera os eventos. Use a coleo de representante para implementar a adicionar e remover Mtodos acessadores para as propriedades de evento. Use as propriedades de evento pblica para adicionar e remover representantes do manipulador de eventos nas classes que manipular os eventos.
Exemplo O exemplo C# implementa as propriedades MouseDown de evento e MouseUp, Usando. para armazenar representante cada do evento um EventHandlerList As palavras-chave das construes Propriedade das evento so em negrito.
Visual C# Consolidado
492
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()); } }
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.
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
Visual C# Consolidado
495
Configuraes de Compilao
Configuraes de compilao fornecem uma maneira de armazenar vrias verses de soluo e propriedades do projeto. A configurao ativa pode ser rapidamente acessada e alterada, permitindo que voc facilmente crie vrias configuraes do mesmo projeto. Por padro, e projetos criados com Visual Studio incluiem configuraes Debug e Release. Configuraes Debug so automaticamente configuradas para depurar um aplicativo, e configuraes Release so configuradas para a verso final do aplicativo. Para mais informaes, consulte COMO: defina configuraes Debug e Verso. Voc tambm pode criar e editar suas prprias configuraes personalizadas de soluo e projeto para atender s necessidades do seu aplicativo. Para mais informaes, consulte Como criar e editar configuraes:. Dois nveis de configuraes de compilao podem ser definidos no Visual Studio: configuraes de soluo e configuraes do projeto. Configuraes de Soluo Um Configurao de soluo especifica como os projetos em uma soluo sero compilados e (se ativado) implantado. Para definir uma nova configurao de soluo, abra a Caixa de Dilogo Configuration Manager . e selecione New da lista Active solution configuration Cada entrada em uma configurao de soluo inclui um nome de projeto, uma configurao, uma configurao de plataforma, uma configurao de compilao, e (se ativado) uma configurao Deploy. A combinao da configurao de soluo e da configurao de plataforma escolhidas determina a configurao do projeto que ser usada. Para obter mais informaes sobre soluo de plataformas, consulte Criar plataformas. Voc pode criar quaisquer nmeros de configuraes de soluo, cada um com um nome exclusivo. O Ambiente integrado de desenvolvimento do Visual Studio (IDE) automaticamente atribui configuraes de soluo sempre que voc:
Adicionar uma plataforma de projeto com Create new solution platforms selecionada. Adicionar uma configurao de projeto com Create new solution configurations selecionada. Adicionar um novo projeto que ir ser implantado em vrias plataformas, um dos quais novo.
Configuraes de soluo tambm fornecem informaes de contexto do projeto em geral para o IDE. Por exemplo, se a configurao de soluo ativa especifica que um projeto ser compilado para um dispositivo mvel, a Caixa de ferramentas exibir somente itens de projeto que podem ser usados em um projeto de dispositivo mvel enquanto voc estiver trabalhando neste projeto. Configuraes do projeto A configurao e plataforma do projeto so usadas juntas para especificar as propriedades a serem usadas ao compilar o projeto. Um projeto pode ter um conjunto de propriedades de projeto definidas para cada combinao exclusiva de uma configurao e plataforma. Propriedades do projeto so editadas com o Project Designer. Determinados painis no Project Designer contm listas suspensas que indicam a configurao e combinao de plataforma do projeto atual. Voc pode definir as propriedades dependentes da configurao em cada configurao de projeto conforme necessrio. Propriedades de projeto podem ser usadas para determinar, por exemplo,
Visual C# Consolidado
496
quais itens de projeto sero includos em uma compilao particular, quais arquivos de sada sero criados, onde os arquivos de sada sero colocados, e como eles sero otimizados. Configuraes de projeto podem diferir bastante. Por exemplo, as propriedades de configurao de um projeto podem especificar que seu arquivo de sada seja otimizado para que o binrio resultante ocupe o espao mnimo, enquanto outro projeto pode ser otimizado de forma que o seu executvel execute com a velocidade mxima. Configuraes do projeto no so armazenadas pelo usurio, mas pela soluo, para que elas possam ser compartilhadas por uma equipe. Embora as dependncias de projeto so independentes da configurao, somente os projetos especificados na configurao de soluo ativa sero compilados. Alterar Configuraes de Solution Quando voc cria uma soluo, o Visual Studio usa a configurao de soluo ativa, que especifica as configuraes do projeto para usar para cada projeto a ser compilado. Voc pode alterar a configurao ativa diretamente na lista suspensaSolution Configurations na barra de ferramentas padro, ou a partir da caixa de dilogo Configuration Manager . Observao Se voc no puder encontrar as configuraes de soluo na barra de ferramentas padro ou no puder acessar o Configuration Manager, voc pode ter as configuraes de desenvolvedor do Visual Basic aplicadas. Para mais informaes, consulte COMO: Gerenciar configuraes de compilao desenvolvedor de configuraes aplicado. Como o IDE atribui configuraes do projeto para serem compiladas Quando voc cria uma nova soluo de configurao (ao invs de copiar a que j exista), o IDE determina as configuraes padro do projeto para os projetos que ele ir compilar usando os seguintes critrios de seleo para cada projeto (avaliados nesta ordem): 1. A nova soluo de configurao criar uma configurao de projeto cujo nome corresponde exatamente ao seu. Os nomes de configurao no diferenciam maisculas de minsculas. Se no houver nenhuma correspondncia de nome exato, a nova configurao de soluo ir compilar uma configurao de projeto cujo nome corresponde parte de configurao do seu nome, mesmo que a parte da plataforma tambm no corresponda. (Lembre-se que a conveno de nomeao <configuration name> <platform-name>.) Se ainda no houver correspondncia, a nova configurao de soluo ir compilar a primeira configurao listada para o projeto.
2.
3.
Como o IDE atribui configuraes de soluo Quando voc cria uma configurao de projeto e marca Create new solution configurations o IDE procura uma configurao de soluo nomeada apropriadamente para compilar o projeto em cada plataforma que ele suporta. Em alguns casos, o IDE ir renomear as configuraes de soluo existentes ou criar novas. A IDE determina como atribuir as configuraes de soluo usando os critrios de seleo a seguir:
Visual C# Consolidado
497
Se uma configurao de projeto no especifica uma plataforma ou especifica uma nica plataforma, ento uma configurao de soluo cujo nome corresponde quele da nova configurao de projeto ser encontrada ou adicionada. Nesse caso, o nome da soluo de configurao padro no inclui um nome de plataforma; ele assume a forma <project configuration name>. Se um projeto suportar vrias plataformas, uma soluo de configurao ser encontrada ou adicionada para cada configurao de projeto para compilar cada projeto em cada plataforma que ele suporta. O nome de cada configurao de soluo inclui o nome de configurao do projeto e o nome da plataforma; ele assume a forma <project configuration name> <platform name>.
Compilar plataformas
Plataformas de compilao fornecem uma maneira de armazenar vrias verses de soluo e propriedades de projeto aplicveis especificamente para direcionar plataformas. Por exemplo, voc pode criar uma configurao do Debug que direciona para uma plataforma x 86, e uma configurao do Debug que direciona para uma plataforma x64. A plataforma ativa pode ser rapidamente acessada e alterada, permitindo que voc facilmente crie um projeto selecionando vrias plataformas. COMO: configurar projetos para plataformas de destino Visual Studio 2005 permite que voc configure seus aplicativos para direcionar para diferentes plataformas, incluindo plataformas de 64 bits. Para obter mais informaes sobre suporte em plataforma de 64 bits no Visual Studio 2005, consulte Aplicativos de 64 bits. Selecionando plataformas com o Gerenciador de configuraes O Configuration Manager fornece uma maneira para voc adicionar rapidamente uma nova plataforma de destino em seu projeto. Se voc selecionar uma das plataformas includas no Visual Studio, as propriedades de seu projeto so modificadas para compil-lo para a plataforma selecionada.
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.
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.
Visual C# Consolidado
499
2. 3.
Em a Active solution platform box, selecione <Edit>. A Edit Solution Platforms Caixa de dilogo aberta. Clique na plataforma voc deseja remover, e clique em Remove.
Selecionando vrias plataformas com uma soluo Porque voc pode alterar as configuraes com base na combinao de configurao e configuraes de plataforma, voc pode configurar uma soluo que pode selecionar mais de uma plataforma.
possvel ter uma plataforma no nvel de soluo como, por exemplo, x64, e no ter projetos nesta soluo direcionando para a mesma plataforma. Tambm possvel ter vrios projetos na sua soluo, cada um direcionado para diferentes plataformas. recomendvel que se voc tiver uma dessas situaes, voc crie uma nova configurao com um nome descritivo para evitar confuso. COMO: Preparar e gerenciar Compilaes Visual Studio 2005 oferece uma variedade de formas para ajud-lo a organizar quais arquivos esto includos em uma compilao de uma soluo ou projeto, qual conjunto de propriedades do projeto est em vigor enquanto compila, e em que ordem os projetos sero compilados. Esta seo contm tpicos que explicam vrios procedimentos para preparar e gerenciar compilaes. A seguir esto os procedimentos comuns do Visual Studio para preparar e gerenciar compilaes. Observao As opes disponveis nas caixas de dilogo, e os nomes e locais do menu de comandos que voc v, podem diferir do que descrito na Ajuda dependendo das configuraes ou edio ativas. Esta pgina Ajuda foi escrita com base no General Development settings. Para exibir ou alterar as configuraes, escolha Import and Export Settings no menu Tools. Para mais informaes, consulte Configuraes do Visual Studio. Para compilar, recompilar, ou limpar uma soluo inteira 1. 2.
o
Em Solution Explorer, selecione ou abra a soluo desejada. No menu Build, escolha Build Solution, Rebuild Solution,. ou Clean Solution Escolha Build ou Build Solution para compilar somente os arquivos e componentes de projetos que foram alterados desde a ltima compilao.
Visual C# Consolidado
500
Observao O comando Build passa a ser Build Solution quando uma soluo inclui mais de um projeto.
o o
Escolha Rebuild Solution para " Limpar " a primeira soluo, e ento compilar todos os arquivos e componentes de projeto . Escolha Clean Solution para excluir quaisquer arquivos intermedirios e de sada, deixando somente os arquivos e componentes de projeto, dos quais novas ocorrncias de arquivos intermedirios e de sada podem ser compiladas. Em Solution Explorer, selecione ou abra o projeto desejado. No menu Build, escolha Build [Project Name] ou Rebuild [Project Name]. Escolha Build [Project Name] para criar somente esses componentes de projeto que foram alterados desde a ltima compilao. Escolha Rebuild [Project Name] para " Limpar " o projeto primeiro, e ento compilar os arquivos de projeto e todos os seus componentes. No menu Tools, escolha Options. Na caixa de dilogo Options, expanda a pasta Projects and Solutions, e escolha Build and Run. A caixa de dilogo Compilar e executar, projetos e solues, Opes aberta. Selecione a opo Only build startup projects and dependencies on Run. Quando esta opo estiver selecionada, somente o projeto de inicializao atual e suas dependncias so criados quando voc:
3.
Escolhe Start (F5) a partir do Menu Debug. OuEscolhe Build Solution (CTRL+SHIFT+B) a partir do Menu Build. Quando esta opo estiver desmarcada, o comando anterior no compila todos os projetos, suas dependncias, e os arquivos de soluo. Por padro, esta opo no selecionada.
Somente para projetos em Visual C++, um submenu Project Only do menu Build exibe trs comandos especficos do projeto: Criar somente projname < > Reconstruir somente projname < > Limpar somente projname < > Esses trs comandos compilam, limpam e compilam, ou limpam o Projeto Visual C++ atualmente selecionado no Solution Explorer, sem compilar ou limpar quaisquer dependncias do projeto ou arquivos de soluo.
Para compilar em lotes vrias configuraes do projeto 1. 2. 3. No menu Build, escolha Batch Build. Marque as caixas de seleo para as configuraes do projeto que deseja criar. Escolha Build ou Rebuild.
Visual C# Consolidado
501
1. 2.
No menu Tools, escolha Options. Na caixa de dilogo Options, expanda a pasta Projects and Solutions, e escolha Build and Run. A caixa de dilogo Opes, Criar e executar, projetos e solues abre. Selecione uma opo na lista Before building. No menu Tools, escolha Options. Na caixa de dilogo Options, expanda a pasta Projects and Solutions, e escolha General. A caixa de dilogo Opes, Geral, projetos e solues abre. Se desejar que a janela de sada venha para a frente e mostre o andamento da compilao, selecione Show Output window when build starts. Se voc desejar para ver todos os erros de uma compilao na lista a tarefas quando a compilao terminado, selecione Always show Error List if build finishes with errors.
3. 1. 2.
3. 4.
COMO: Alterar a pasta de sada de compilao Visual Studio fornece uma maneira para que voc modifique a localidade de sada gerada pelo seu projeto. Devido a diferenas no Project Designers para as diferentes linguagens, o procedimento para modificar a pasta de sada de compilao varia. Projetos do Visual Basic Para projetos Visual Basic, a alterao da pasta de sada de compilao feita atravs do Compile Pane. do Project Designer. Para mais informaes, consulte COMO: alterar o local de compilao para um aplicativo. ,Projetos Visual C# e Visual J#
COMO: compilar para uma pasta de sada comum Por padro, o Visual Studio 2005 cria cada projeto em uma soluo na sua prpria pasta dentro da soluo. Voc pode alterar os caminhos de sada de compilao dos projetos para forar que todas as sadas sejam colocadas na mesma pasta. Para colocar todas as sadas de soluo em uma pasta comum 1. Clique em um projeto na soluo.
Visual C# Consolidado
502
2. 3. 4.
No menu Project, clique em Properties. Dependendo do tipo de projeto, clique na guia Compile ou na guia Build, e defina o Output path para uma pasta que ser usada por todos os projetos na soluo. o Repita as etapas de 1 a 3 para todos os projetos na soluo.
Visual C# Consolidado
503
dependncia de projeto do projeto que consome o cdigo. Essas relaes de dependncia podem ser definidas na Caixa de Dilogo Project Dependencies. Para atribuir dependncias a projetos 1. 2. Em Solution Explorer, selecione um projeto. No menu Project, escolha Project Dependencies. A caixa de dilogo Project Dependencies aberta. Observao A opo Project Dependencies somente estar disponvel em solues contendo mais de um projeto. 3. 4. Na aba Dependencies , selecione um projeto a partir do menu suspenso Project. No campo Depends on, selecione a caixa de seleo de qualquer outro projeto que deve ser compilado antes deste projeto. Em Solution Explorer, selecione um projeto. No menu Project, escolha Project Dependencies. A caixa de dilogo Project Dependencies aberta. Observao A opo Project Dependencies somente estar disponvel em solues contendo mais de um projeto. 3. 4. Na aba Dependencies, selecione um projeto a partir do menu suspenso Project. No campo Depends on, desmarque as caixas de seleo ao lado de outros projetos que no sejam mais dependncias deste projeto.
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
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.
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.
Edit and Continue para Visual Basic e Visual C#. Voc pode alterar seu cdigo do Visual Basic e C# durante a depurao de seu aplicativo, e continuar a executar o aplicativo ao mesmo tempo. Este recurso aumenta sua produtividade, permitindo-lhe a correo de erros rapidamente, testar novas funcionalidades, e modificar
Visual C# Consolidado
508
funcionalidades existentes. Para obter mais informaes, consulte Editar e continuar (Visual Basic) e Edio e continuao (Visual C#).
Depurao remota mais segura com configurao mais simples. Configurar a depurao remota, copiando um nico executvel para o computador remoto sem instrues de instalao complexas ou registro. A depurao remota agora mais segura e robusta. Alm disso, agora voc pode depurar aplicativos no gerenciados e gerenciados de 64-bit. Para obter mais informaes, consulte Instalao de depurao remota.
Visualizadores. Ferramentas eficientes permitem voc exibir dados em um formato natural e intuitivo. Voc pode iniciar um visualizador em uma janela Watch ou a partir do novo DataTips aprimorado. Por exemplo, agora voc pode exibir uma seqncia de caracteres como um documento HTML ou XML. Voc pode usar os visualizadores existentes ou escrever seus prprios. Para obter mais informaes, consulte Visualizadores.
Depurador de DataTips aprimorado. O depurador de DataTips foi aperfeioado. Voc pode percorrer o contedo de estruturas de dados complexas no editor de cdigo-fonte. Voc pode abrir um visualizador de um DataTip para visualizar os dados em um formato intuitivo e natural. Para obter mais informaes, consulte HOW TO: Use DataTips.
Depurao Just My Code Esse recurso habilita voc a focalizar apenas o cdigo que voc tenha escrito e ignorar cdigo no qual voc no esteja interessado. Para obter mais informaes, consulte Como: etapa INTO apenas meu cdigo.
Tracepoints e pontos de interrupo UI aprimorados. Pontos de interrupo no so mais para interromper apenas. Tracepoints so uma nova maneira de usar pontos de interrupo para executar uma ao personalizada. Com tracepoints, voc pode imprimir uma mensagem ou executar uma macro de automao do Visual Studio, e voc determina se o depurador interrompe ou continua quando ele acerta um tracepoint. A interface com o usurio aprimorada para tornar a definio de todos os pontos de interrupo mais fcil e rpida. Para obter mais informaes, consulte Pontos de interrupo e Tracepoints.
Melhores ferramentas para depurao de multiprocessos. A nova janela Processes mostra todos os processos aos quais voc est conectado para depurao. Filtros de ponto de interrupo permitem voc anexar um ponto de interrupo a processos, segmentos e computadores especificados. A caixa de dilogo Attach to Process simplificada para facilidade de uso, com informaes de processos movidas a partir da caixa de dilogo para a janela Processes. Para obter mais informaes, consulte Como: Anexar a um Processo em Execuo: e Como: Usar Processes Window:.
Assistente de Exceo para Visual Basic, C# e Visual J#. A nova caixa de dilogo Exception Assistant fornece melhores informaes quando ocorre uma exceo em um programa do Visual Basic, C# ou Visual J#. Para obter mais informaes, consulte Assistente de exceo.
Suporte aprimorado para gerenciar informaes da depurao. Melhor suporte para smbolo de servidor e mensagens de diagnstico para solucionar problemas de informaes da depurao.
Depurao do cdigo em tempo de criao. Voc pode depurar seu aplicativo Visual Basic, C# ou Visual J# enquanto voc est o criando. Utilizando a janela Immediate, voc pode testar e depurar suas funes e mtodos sem ter que executar o aplicativo.
Visual C# Consolidado
509
o o o o
Suporte a novos recursos no SQL Server 2005, incluindo: Depurao de tipos de objetos de banco de dados gerenciado. Depurao de aplicativos multicamadas, passando entre as camadas do aplicativo e do banco de dados SQL Server. Depurao para frente e para trs entre cdigo gerenciado e T-SQL. Suporte para depurao em plataformas de 64 bits. Alteraes no Depurador do Visual Studio .NET 2003
O depurador do Visual Studio .NET 2003 foi aprimorado pela adio dos seguintes recursos:
Aprimoramentos de segurana, incluindo uma nova restrio na depurao Just-In-Time, que melhora a segurana impedindo a depurao Just-In-Time entre computadores. Para obter mais informaes, consulte Depurao Just-In-Time. Depurao remota usando pipes, uma nova alternativa para depurao TCP/IP que ajuda e proporciona mais segurana. Para obter mais informaes, consulte Depurao Remota Usando Pipes. A capacidade de carregar despejos contendo informaes gerenciadas. Despejos gerenciados podem ser depurados usando a ferramenta SOS de depurao, que executada a partir da janela Command. Depurao automtica em servios XML da Web. Para obter mais informaes, consulte Depurao em Servios XML da Web. Suporte para fazer o download automaticamente de smbolos de depurao a partir de um smbolo de servidor. Para obter mais informaes, consulte Servidor de Smbolo. Mensagens de erro aprimoradas especialmente para erros que ocorrem durante a depurao de aplicativos da Web. Uma nova pseudovarivel $exception para recuperar informaes sobre excees C#. Alteraes no Depurador do Visual Studio .NET 2002
O Visual Studio .NET 2002 fornecia um nico depurador integrado para todas as linguagens do Visual Studio. Uma nova e unificada interface combinou recursos de antigos depuradores do Visual C++ e Visual Basic, bem como muitos novos recursos. As principais melhorias para depurao incluem:
Depurao de linguagens cruzadas do Visual Basic . NET, Visual C++ .NET, Visual C# . NET, Managed Extensions for C++, script, e SQL. Depurao de aplicativos escritos para o Common Language Runtime do Microsoft .NET Framework, bem como aplicativos nativos Win32. Anexar a um programa em execuo, tanto no computador host ou remoto. Anexar automaticamente a processos do servidor para aplicativos ATL Server, aplicativos ASP.NET da Web, e servios ASP.NET da Web quando estiverem depurando. Depurao de vrios programas diferentes, iniciando vrios programas em uma nica soluo do Visual Studio, ou anexando a outros programas que j esto sendo executados. Usar verificao de erros em tempo de execuo no Visual C++ para detectar erros comuns em tempo de execuo, tais como corrupo do ponteiro da pilha, saturaes de matrizes locais, corrupo de pilha, dependncias ao inicializar variveis locais, e perda de dados em uma atribuio a uma varivel mais curta. Verificar a segurana de buffer dos aplicativos do Visual C++ com a opo /GS. Voc pode usar esta opo para detectar saturaes de buffer, o que substitui o endereo do remetente
Visual C# Consolidado
510
Definir um ponto de interrupo em uma DLL que ainda no foi carregada. O ponto de interrupo automaticamente tornar-se-a ativo quando a DLL carregar. Voc no precisar especificar DLLs que voc deseja depurar em uma caixa de dilogo Additional DLLs, como voc fez no depurador do Visual C++. Depurao de clientes de servios XML da Web aos servios XML da Web, com um pilha de chamadas integrada entre aplicativos cliente e servidor. Janelas no restritas substituram caixas de dilogo restritas para pontos de interrupo e segmentos, o que fornece maior flexibilidade no controle e acesso de recursos na sua rea de trabalho.
Segurana do Depurador
A capacidade de depurar um outro processo lhe concede poderes extremamente grandes que voc no teria de outro modo, especialmente quando estiver depurando remotamente. Um depurador mal-intencionado poderia inflingir danos amplos no computador que est sendo depurado. Devido a isso, h restries sobre quem pode fazer a depurao. Para obter mais informaes, consulte Permisses de depurao remota. Muitos desenvolvedores no entanto, no percebem que a ameaa de segurana tambm pode fluir na direo oposta. possvel que o cdigo mal-intencionado do processo de depurao comprometa a segurana do computador de depurao: existe uma gama de vulnerabilidades de segurana que devem ser protegidas. Prticas Recomendadas de Segurana No h um relacionamento de confiana implcito entre o cdigo que voc est depurando, e o depurador. Se voc estiver disposto a depurar algo, voc tambm deve estar disposto a executlo. A linha inferior que voc deve ser capaz de confiar naquilo que voc est depurando. Se voc no puder confiar, ento voc no deve depurar, ou voc deve depurar a partir de um computador que voc possa se responsabilizar a se comprometer, e em um ambiente isolado. Para reduzir a superfcie do ataque em potencial, a depurao deve ser desativada em computadores de produo. Pelo mesmo motivo, a depurao nunca deve ser ativada indefinidamente. Segurana de Depurao Gerenciada Aqui esto algumas recomendaes gerais que se aplicam a toda depurao gerenciada.
Tenha cuidado ao se anexar a processo de um usurio no confivel: quando voc fizer isso, voc assume que ele confivel.Quando voc tenta se anexar a um processo de usurio no confivel, uma caixa de dilogo de aviso de confirmao, ser exibida perguntando se voc deseja se anexar ao processo. " Usurios Confiveis " incluem voc, e um conjunto de usurios padro normalmente definidos em computadores que tm o .NET Framework instalados, como aspnet, localsystem, networkservice, e localservice. Para obter mais informaes, consulte Aviso de Segurana: Attaching para um processo no confiveis pode ser Dangerous. Tenha cuidado ao fazer download de um projeto de fora da Internet e ao carreg-lo no Visual Studio . Isso muito arriscado para fazer mesmo sem depurao. Quando voc fizer isso, voc est presumindo que o projeto e o cdigo que ele contm so confiveis.
Segurana em Depurao Remota A depurao local geralmente mais segura do que a depurao remota. A depurao remota aumenta a rea tatal de superfcie que pode ser investigada.
Visual C# Consolidado
511
O Monitor de Depurao Remota do Visual StudioMonitor (msvsmon.exe) usado na depurao remota, e h vrias recomendaes de segurana para configur-lo. A maneira preferida para configurar o modo de autenticao a Autenticao do Windows, pois o modo No Authentication (no-autenticao) no seguro. Ao usar o modo de Autenticao do Windows, esteja ciente que conceder uma permisso de usurio no confivel para se conectar ao msvsmon perigoso, conforme ser indicado por um aviso de Caixa de Dilogo. No depure um processo desconhecido em um computador remoto: h possveis vulnerabilidades que podem afetar a mquina que encontra-se executando o depurador, ou que pode comprometer msvsmon.exe, o Remote Monitor depurao Visual Studio. Se voc deve depurar um processo desconhecido de qualquer forma, tente depur-lo localmente, e use um firewall para manter quaisquer ameaas em potencial localizadas. Segurana de Depurao de Servios da Web mais seguro depurar localmente, mas uma vez que, provavelmente, voc no tenha o Visual Studio instalado no servidor da Web, a depurao local pode no ser prtica. Geralmente, a depurao de Servios da Web feita remotamente, exceto durante o desenvolvimento, portanto as recomendaes de segurana de depurao remota tambm se aplicam a depurao de servios da Web. Aqui esto algumas recomendaes adicionais. Para obter mais informaes, consulte Depurao Servios XML da Web.
No ative a depurao em um servidor da Web que foi comprometido. Certifique-se de que voc sabe que o servidor Web seguro antes de depur-lo. Se voc no tiver certeza de que ele seguro, no faa a depurao. Tome cuidado principalmente se voc estiver depurando um servio da Web que est exposto na Internet.
Componentes Externos Esteja ciente dos status de confiana de componentes externos com que o programa interage, especialmente se voc no tiver escrito o cdigo. Tambm esteja ciente de componentes que o Visual Studio ou o depurador possa usar. Smbolos e Cdigo Fonte Duas ferramentas do Visual Studio que exigem preocupao com a segurana so as seguintes:
Source Saver, que lhe fornece verses de cdigo fonte provenientes de um repositrio de cdigo fonte. Ele til quando voc no tiver a verso atual do cdigo fonte de um programa. Para obter mais informaes, consulte Como: Obter cdigo fonte usando Source Server e Aviso de Segurana: depurador deve executar comando no confiveis. Symbol Server, que usado para fornecer os smbolos necessrios para depurar uma falha durante um chamada do sistema. Para obter mais informaes, consulte Como especificar um caminho smbolo: e Como usar um servidor smbolo:.
Visual C# Consolidado
512
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
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
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.
Especifica o depurador a ser executado, com as seguintes opes: Local Windows Debugger Remote Windows Debugger Web Service Debugger MPI Cluster Debugger
Visual C# Consolidado
515
Command (Local Windows Debugger) Remote Command (Remote Windows Debugger) Application Command (MPI Cluster Debugger)
Especifica o comando para iniciar o programa que voc est depurando na mquina local. O caminho para o .exe conforme ilustrado pelo computador remoto.
Especifica argumentos para o comando especificado acima. Command Arguments (Local Windows Voc pode usar os seguintes operadores de redirecionamento na Debugger e Remote caixa: Windows Debugger) < file L stdin do arquivo. Application Arguments (MPI Cluster Debugger) > file Grava stdout em arquivo. >> file Anexa stdout ao arquivo. 2> file Grava stderr em arquivo. 2>> file Anexa stderr ao arquivo. 2> &1 Envia as sadas stderr (2) ao mesmo local que stdout (1). 1> &2 Envia sadas stdout (1) ao mesmo local que stderr (2). Na maioria dos casos, esses operadores so aplicveis somente a aplicativos do console. Working Directory Especifica a pasta de trabalho do programa que est sendo depurado, relativo ao diretrio do projeto onde o seu EXE est localizado. Se voc deixar isto em branco, a pasta de trabalho ficar o diretrio do projeto. Para depurao remota, o diretrio do projeto ser ativado no servidor remoto. Especifica a iniciar ou anexar para o aplicativo. A Configurao padro No. Especifica o nome de um computador (diferente do seu) no qual voc deseja depurar um aplicativo ou um Nome do servidor Msvsmon. Voc tambm pode selecionar isso a partir da caixa de dilogo Processes (para obter mais informaes, consulte Selecionando um computador remoto). Se voc especificar o nome da mquina aqui, tambm dever especificar o tipo de conexo em Connection. O macro RemoteMachine Build definido para o valor da propriedade; para obter mais informaes, consulte Macros para construir comandos e propriedades. Permite que voc alterne entre depurao local e remota. Especifique um nome de computador remoto na caixa Remote Server Name. Tipos de conexo incluem: Remote with Windows Authentication Remote with No Authentication (Native Only) Observao A depurao remota com No Authentication pode deixar o computador remoto vulnervel a violaes de segurana. O Modo de Autenticao do Windows mais seguro. Para obter mais informaes, consulte Instalao de depurao
Attach (Local Windows Debugger and Remote Windows Debugger) Remote Server Name (Remote Windows Debugger and MPI Cluster Debugger)
Visual C# Consolidado
516
remota. HTTP URL (Web Service Especifica a URL onde o projeto que voc est depurando est Debugger) localizado. Debugger Type Especifica o tipo de depurador a ser usado: Native Only, Managed Only, Mixed ou Auto (padro). Native Only para cdigo C++ no gerenciado. Managed Only para cdigo que executado com o Common Language Runtime (cdigo gerenciado). Mixed dispara depuradores para cdigo gerenciado e no gerenciado. Auto determina o tipo de depurador com base no compilador e informaes EXE. Especifica variveis de ambiente para o programa que voc est depurando. Essas variveis substituem o ambiente do sistema ou so mescladas com o ambiente do sistema, dependendo da configurao Merge Environment. Quando voc clica na coluna configuraes, um boto ( ) elipse aparece. Clique no boto ( variveis de ambiente. Merge Environment (Local Windows Debugger) SQL Debugging (todos menos MPI Cluster Debugger) ) elipse para editar
Determina se as variveis especificadas na caixa Environment sero mescladas com o ambiente definido pelo sistema operado. A configurao padro Sim. Ativa a depurao de procedimentos SQL de seu aplicativo Visual C++. A configurao padro No.
Pasta C/C++ (Categoria geral) Configurao Debug Information Format (/Z7, /Zd, Zi, /ZI) Descrio Especifica o tipo de informaes de depurao a serem criadas para o projeto. A opo padro (/ZI) cria um banco de dados do programa (PDB) em formato compatvel Edio e Continuao. Para obter mais informaes, consulte /Z7, /Zd, /Zi, /ZI (formato de informaes de depurao). Para obter detalhes, consulte Arquivos PDB e Arquivos DBG
Pasta C/C++ (categoria de otimizao) Configurao Descrio Optimization Especifica se o compilador deve otimizar o cdigo que ele produz. A otimizao altera o cdigo que executado. O cdigo otimizado no corresponde mais ao cdigo fonte, portanto a depurao difcil. A opo padro (Disabled (/0d) suprime a otimizao. Voc pode desenvolver com otimizao suprimida, e em seguida, ativ-la ao criar a verso de produo do seu cdigo.
Pasta vinculadora (Categoria de depurao) Configurao Generate Debug Info (/DEBUG) Generate Program Descrio Informa o vinculador para incluir informaes da depurao, que tero o formato especificado por /Z7, /Zd, Zi, ou /ZI. Especifique o nome de um arquivo PDB nesta caixa. Voc deve
Visual C# Consolidado
517
Database File (/PDB:nome) selecionar ZI ou /Zi para formato de informaes de depurao. Strip Private Symbols (/PDBSTRIPPED:filename) Especifique o nome de um arquivo PDB nesta caixa se voc no desejar incluir smbolos particulares no arquivo PDB. Esta opo cria um segundo arquivo (PDB) de banco de dados de programa quando voc cria sua imagem de programa com qualquer uma das opes de compilador ou vinculador que geram um arquivo PDB (/DEBUG, /Z7, /Zd, ou /Zi). Esse segundo arquivo PDB omite smbolos que voc no desejaria enviar para seus clientes. Para obter mais informaes consulte /PDBSTRIPPED (smbolos Private Faixa). Informa o vinculador para gerar um arquivo de mapa durante a vinculao. A configurao padro No. Para obter mais informaes consulte /MAP (Gerar Mapfile). Se voc escolher gerar arquivo de mapa, voc pode especificar o arquivo de mapa nesta caixa. Para obter mais informaes consulte /MAP (Gerar Mapfile). Inclui funes exportadas no arquivo de mapa. A configurao padro No. Para obter mais informaes consulte /MAPINFO (inclui informaes em Mapfile). Especifica configuraes para a opo Linker /ASSEMBLYDEBUG. Possveis valores so: No debuggable attribute emitted. Runtime tracking and disable optimizations (/ASSEMBLYDEBUG); esta a configurao padro, No runtime tracking and enable optimizations(/ASSEMBLYDEBUG:DISABLE). <inherit from parent or project defaults>. Para obter mais informaes consulte /ASSEMBLYDEBUG (Adicionar DebuggableAttribute).
Map File Name (/MAP:nome) Map Exports (/MAPINFO:EXPORTS) Debuggable Assembly (/ASSEMBLYDEBUG)
Voc pode alterar essas configuraes na pasta Configuration Properties (categoria de depurao) programaticamente usando a interface Microsoft.VisualStudio.VCProjectEngine.VCDebugSettings. Para obter mais informaes, consulte VCDebugSettings.
Esta seo descreve as permisses necessrias para depurao SQL. Essas permisses so apenas aqueles impostas pela depurao do SQL; no pode ser outra permisso necessria em
Visual C# Consolidado
518
outro lugar. Por exemplo, para depurar um processo em execuo como um usurio diferente do que sua conta de logon do Windows, a conta deve ser de um membro do grupo de administradores do sistema para o computador. Para obter mais informaes, consulte Permisses de depurao remota. H duas contas de usurio que voc necessita considerar
A conta do aplicativo a conta de usurio que Visual Studio ou o aplicativo cliente que estiver executando sob. Esta conta uma conta de usurio do Windows e deve ser um membro do grupo sysadmin no SQL Server que est sendo depurado. A conta de conexo a identidade usada para fazer a conexo ao SQL Server. Esta a conta que voc insere quando define a conexo no Server Explorer ou que voc especifica na seqncia de conexo quando o aplicativo se conecta a um banco de dados. Esta conta pode ser uma conta de usurio do Windows, usando a autenticao do Windows, nesse caso, a mesma conta como a conta do Windows na qual Visual Studio est sendo executado. Ou a conta de conexo pode ser uma conta de logon do SQL Server. Para depurao SQL Server 2005, a conta de conexo deve ser um membro da funo sysadmin. Um usurio que j tenha privilgios SysAdmin deve executar o seguinte:
sp_addsrvrolemember 'Domain\Name', 'sysadmin'
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.
Visual C# Consolidado
519
Especifica argumentos de linha de comando para o programa a ser Argumentos da linha de comando depurado. O nome do comando o nome do programa especificado no programa externo Iniciar. Se a Ao Iniciar definida para iniciar URL, argumentos de linha de comando sero ignorados. Diretrio de trabalho Usar mquina remota Especifica a pasta de trabalho do programa que est sendo depurado. No Visual Basic, a pasta de trabalho o diretrio de que aplicativo iniciado, \bin, por padro. Quando a caixa de seleo estiver marcada, a depurao remota ativado. Na caixa de texto, voc pode digitar nome de um computador remoto onde o aplicativo ser executado para fins de depurao ou um Nome do servidor Msvsmon. O local do EXE no computador remoto especificado pela propriedade Output Path na guia construir. O local deve ser um diretrio compartilhvel no computador remoto. Permite a voc depurar chamadas para cdigo nativo (no gerenciado) de Win32 de seu aplicativo gerenciado. Isso tem o mesmo efeito de que selecionar misto para tipo de depurador em um projeto Visual C++. Permite a depurao de objetos de banco de dados do SQL Server.
Guia Compilar: Pressione boto Opes avanadas de compilao Configurao Ativar otimizaes Descrio Esta opo deve ser desmarcada. Otimizao faz com que o cdigo que realmente executado seja diferente do cdigo fonte visto no Visual Studio, e assim torna difcil depurao. Se o cdigo otimizado, smbolos no so carregados por padro quando estiver depurando com Just My Code. Definidos por padro nas verses de lanamento e de depurao, esta configurao (equivalente a opo do compilador /debug) cria informaes da depurao ao tempo de compilao. O depurador usa essas informaes para mostrar nomes de variveis e outras informaes em um formulrio til quando voc est depurando. Se voc compila seu programa sem essas informaes, a funcionalidade do Depurador ser limitada. Para obter mais informaes, consulte /Debug.
Definir constante Definir esse smbolo permite compilao condicional das funes de sada da classe de depurao. Com esse smbolo definido, mtodos de classe de DEBUG depurao geram a sada para a Janela de sada. Sem esse smbolo, mtodos da classe de depurao no so compilados e nenhuma sada gerada. Este smbolo deve ser definido na Verso de depurao e no definido na verso de lanamento. Definir esse smbolo em uma verso de lanamento cria desnecessrio cdigo que torna o programa lento. Definir constante Definir esse smbolo permite a compilao condicional das funes de sada da classe Rastrear. Com esse smbolo definido, os mtodos de classe de Trace rastreamento geram a sada para a Janela de sada. Sem esse smbolo, mtodos de classe de rastreamento no so compilados e nenhuma sada de rastreamento gerada. Esse smbolo definido por padro para as verses de depurao e de lanamento.
Visual C# Consolidado
520
VC80.PDB (Mais geralmente, VC x 0.PDB onde x representa a verso do Visual C++). Esse arquivo armazena todas as informaes de depurao para os arquivos OBJ individuais e reside no mesmo diretrio que o project makefile. Esse arquivo armazena todas as informaes da depurao para o arquivo .exe. Para C/C++, ele reside na subpasta \debug.
Sempre que ele cria um arquivo OBJ, o compilador C/C++ mescla informaes da depurao no VC x 0.PDB. As informaes inseridas incluem informaes de tipo mas no inclui informaes smbolo, como definies de funo. Ento, mesmo que todos os arquivos de origem incluam arquivos de cabealho como <windows.h>, os typedefs daqueles cabealhos so armazenados apenas uma vez, especialmente estando em todo arquivo OBJ. O vinculador cria project.PDB, que contm informaes da depurao para o arquivo EXE do projeto. O arquivo do project.PDB contm informaes completas da depurao, incluindo prottipos de funo, no apenas as informaes encontradas em VC x 0.PDB Os dois arquivos PDB permitem atualizaes incrementais. O vinculador tambm incorpora o caminho para o arquivo .pdb no arquivo .exe ou .dll que ele cria. O depurador Visual Studio usa o caminho para o PDB no arquivo EXE ou DLL para localizar o arquivo do project.PDB. Se o depurador no pode localizar o arquivo PDB naquele local ou se o caminho for invlido (por exemplo, se o projeto foi movido para outro computador), o depurador pesquisa o caminho que contm o EXE, os caminhos smbolo especificados na caixa de dilogo Options (pasta Debugging, n Symbols). O depurador no carregar um PDB que no coincide com o binrio que est sendo depurado.
Arquivos DBG
Este tpico se aplica a: Visual Studio Express Padro Pro / Team Visual Basic No No No C# No No No C++ Sim Sim Sim J# No No No Dev Web No No No
Visual C# Consolidado
521
Os arquivos DBG so formatos de arquivos executveis portveis (PE) que contm informaes da depurao no formato Codeview para o depurador no Visual Studio (e possivelmente outros formatos, dependendo de como o DBG foi criado). Quando voc no tem origem para determinados cdigos, tais como bibliotecas ou APIs do Windows, os arquivos DBG permitem a depurao. Os arquivos DBG tambm permitem voc para fazer depurao do OLE RPC. Arquivos DBG podem ter sido substitudos por arquivos PDB, que agora so mais comumente usados na depurao. Voc pode usar o utilitrio REBASE.EXE para tirar informaes da depurao de um executvel no formato PE e armazen-lo em um arquivo DBG. O campo de caracterstica do arquivo IMAGE_FILE_DEBUG_STRIPPED no cabealho do arquivo PE informa o depurador que as informaes do Codeview foram extradas para um arquivo DBG separado. Voc pode baixar e instalar arquivos DBG que contm smbolos de depurao de chamadas para as APIs Windows do sistema. Para obter mais informaes, consulte Instalar smbolos de depurao do sistema. Quando voc depurar utilizando smbolos de um arquivo DBG, voc deve usar os nomes totalmente decorados. Por exemplo, para definir um ponto de interrupo em uma chamada para a funo sndPlaySound do Windows, voc precisar especificar o _sndPlaySoundA@8. O depurador do Visual Studio no foi criado para depurao no modo protegido do cdigo no Kernel, mesmo com smbolos DBG. Para modo de depurao do usurio, o Visual Studio requer os seguintes arquivos:
Uma mquina Windows 2000, e os arquivos DBG e PDB no diretrio \winNT\SYMBOLS\DLL. Um computador Windows XP, e os arquivos PDB no diretrio \Windows\SYMBOLS\DLL.
Para obter mais informaes sobre arquivos DBG, consulte o artigo no KB a seguir:
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.
(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).
Este tpico contm as sees a seguir, que fornecem consideraes sobre a preparao para depurar bibliotecas de classes:
Visual C# Consolidado
523
Building a Debug Version Mixed-Mode Debugging Changing Default Configurations Ways to Debug the DLL The Calling Application Controls on a Web Page The Immediate Window
Criando uma verso de depurao No importa como voc inicie a depurao, certifique-se de criar a verso de depurao da DLL primeiro e certifique-se que a verso de depurao est no local onde o aplicativo espera localizlo. Isso pode parecer bvio, mas se voc esquecer desta etapa, o aplicativo pode localizar uma verso diferente da DLL e carreg-la. O programa ento continuar a ser executado, enquanto voc fica imaginando por que o ponto de interrupo nunca foi atingido. Quando voc estiver depurando, voc pode verificar quais DLLs seu programa carregou abrindo o depurador na janela Modules. A janela Modules lista cada DLL ou EXE carregados no processo que voc est depurando. Para obter mais informaes, consulte Como: Usar a Janela Mdules (Mdulos). Para o depurador anexar a cdigos escritos em C++, o cdigo precisa emitir DebuggableAttribute. Voc pode adicionar isso ao seu cdigo automaticamente por meio da vinculao com a opo de linker /ASSEMBLYDEBUG. Modo misto de depurao O aplicativo que chama sua DLL pode ser escrito em cdigo gerenciado ou cdigo nativo. Se a DLL gerenciada chamado pelo cdigo nativo e voc precisar depurar ambos, os depuradores gerenciado e nativo devem ambos estar habilitados. Voc pode verificar isso na caixa de dilogo ou janela <Project> Property Pages. Como fazer isso depende de como voc iniciou a depurao do projeto de DLL ou o projeto do aplicativo que chama. Para obter mais informaes, consulte HOW TO: Depurar no modo misto. Alterando configuraes padro Quando voc cria um projeto de aplicativo console com o modelo de projeto, o Visual Studio cria automaticamente as configuraes necessrias para as configuraes Debug e Release. Se necessrio, voc pode alterar essas configuraes. Para obter mais informaes, veja Configuraes do projeto para uma configurao de depurao no Visual Basic, Configuraes do projeto para um C++ depurar configurao, Configuraes de projeto para depurar C# e J# e HOW TO: definir depurao e configuraes de verso. Maneiras de depurar a DLL Cada um dos projetos nesta seo cria uma DLL. No possvel executar uma DLL diretamente; ela deve ser chamada por um aplicativo (geralmente um EXE). Para obter mais informaes, consulte Criando e gerenciando projetos Visual C++. O aplicativo de chamada pode:
Ser criado em outro projeto na mesma soluo Visual Studio que contm a biblioteca de classes. Um programa existente j implantado em um computador de teste ou produo. Ser localizado na Web e acessado atravs de um URL. Ser um aplicativo da Web que contm uma pgina da Web que incorpore a DLL.
Visual C# Consolidado
524
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.
A janela Immediate
Voc pode avaliar funes ou mtodos na DLL sem ter um aplicativo de chamada, fazendo depurao em tempo de design utilizando a janela Immediate. Para depurar dessa forma, faa o seguinte enquanto o projeto DLL est aberto: 1. 2. Abra a janela Immediate do depurador. Para testar um mtodo denominado Test na classe Class1, instancie um objeto do tipo Class1, digitando o cdigo C# a seguir na janela Immediate, esse procedimento funciona para outras linguagens gerenciadas (C++, VB, J#,) com alteraes de sintaxe apropriadas:
Class1 obj = new Class1();
Em C#, todos os nomes devem ser totalmente qualificados. Alm disso, quaisquer mtodos ou variveis devem estar no escopo atual e no contexto da sesso de depurao. 3. Supondo que Test usa um parmetro int, avalie Test utilizando a janela Immediate:
?obj.Test(10)
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.
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.
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.
Setting
Optimization Defina como Disabled (/0d). O cdigo otimizado mais difcil para depurar, porque as instrues geradas no correspondem diretamente ao seu cdigo fonte. Se voc encontrar o programa que possui um erro que aparece somente no cdigo otimizado, voc pode ativar esta configurao, mas lembre que o cdigo mostrado na janela Disassembly gerado de fonte otimizada que pode no corresponder ao que voc v nas suas janelas de origem. Outros recursos, como depurao, podem no se comportar conforme o esperado. Propriedades de Configurao | Vinculador |N de Depurao Property Name Generate debugging information Setting Voc deve sempre definir esta opo para Yes (/DEBUG) para criar arquivos necessrios para depurao e smbolos de depurao. Quando o aplicativo entra em produo, voc pode definir ela como off.
Visual C# Consolidado
527
Para obter mais informaes, consulte Alterando as configuraes de projeto para depurao C ou C++. Outra maneira de depurar um aplicativo de Windows Forms consiste em iniciar o aplicativo fora do Visual Studio e anexar a ele. Para obter mais informaes, consulte Anexando a um programa em execuo ou a vrios programas. Para configuraes de projeto recomendadas, consulte Preparao da Depurao: Configuraes de Propriedades Recomendveis. Para depurar um aplicativo de Windows Forms do Visual C++ 1. 2. 3. Abra o projeto no Visual Studio. No menu Debug, clique em Start. Depure usando as tcnicas discutidas em Usando o depurador.
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.
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.
Visual C# Consolidado
530
Tambm necessrio configurar o arquivo web.config para ativar a depurao. Isso pode ser configurado manualmente ou automaticamente. Para obter mais informaes, consulte Como ativar depurao para aplicativos ASP.NET:. Para iniciar a depurao, escolha Start no menu Debug. Se voc no ativou manualmente a depurao, a caixa de dilogo Debugging Not Enabled ser exibida, o que lhe dar a opo de ter um arquivo web.config automaticamente criado com depurao ativada, ou executando sem depurao. Depois de esta caixa de dilogo fechar, as configuraes de projeto fazem com que o Visual Studio inicie o navegador selecionado em <Project> Properties Pages e gere dinamicamente uma pgina de teste. Na pgina de teste, voc pode digitar comandos e observar os dados que so retornados pelo seu XML Web Services. Depurao de um XML Web Services de um aplicativo cliente H dois mtodos para depurar um XML Web Services de um aplicativo cliente. Para depurar por um aplicativo cliente e servidor Web XML (mtodo 1) 1. 2. No Visual Studio, crie um novo projeto de XML Web Services. Para obter mais informaes, consulte COMO: Criar Projetos de Servio da Web ASP.NET. No menu Debug, clique em Start para executar o XML Web Services. Esta etapa no somente permite que voc teste se o servio da Web est funcionando, como tambm cria o arquivo web.config, que necessrio para a depurao. 3. 4. 5. 6. 7. 8. 9. No menu Debug, clique em Stop Debugging. Crie um projeto de aplicativo cliente na mesma soluo que seu projeto de XML Web Services. Para fazer isso, no menu Debug, clique em Add New Project. No Solution Explorer, clique com o boto direito do mouse no projeto do cliente e clique em Properties no menu de atalho. Na janela Solution <Name> Properties, abra o n Common Properties e selecione Startup Project. Clique em Multiple Startup Projects. Em Multiple Startup Projects, v para a coluna Action e defina a ao como Start para ambos os projetos. Clique em OK para fechar a janela Solution <Name> Properties.
10. No menu Debug, clique em Start para depurar o aplicativo cliente e o servidor Web XML. Para depurar passando de um aplicativo cliente para um servidor Web XML 1. 2. No Visual Studio, crie um novo projeto de XML Web Services. Para obter mais informaes, consulte COMO: Criar Projetos de Servio da Web ASP.NET. No menu Debug, clique em Start para executar o XML Web Services. Esta etapa no somente permite que voc teste se o servio da Web est funcionando, como tambm cria o arquivo web.config, que necessrio para a depurao. 3. 4. 5. No menu Debug, clique em Stop Debugging. Crie um projeto de aplicativo cliente, na mesma soluo que seu projeto de XML Web Services ou em uma soluo diferente. Em seu projeto do cliente, adicione uma referncia da Web e uma chamada sncrona para o servio da Web.
Visual C# Consolidado
531
6. 7.
No Solution Explorer, clique com o boto direito do mouse no projeto do cliente e clique em Set As Startup Project no menu de atalho. No menu Debug, clique em Start para executar o aplicativo cliente. Quando o aplicativo cliente chama o XML Web Services, o depurador automaticamente entra e inicia a depurao do XML Web Services.
Visual C# Consolidado
532
Para importar um executvel para uma soluo Visual Studio 1. 2. 3. 4. No menu File, clique em Add Project e, em seguida, clique em Existing Project. Na caixa de dilogo Add Existing Project, localize e selecione o executvel. Clique em OK. Inicie o executvel, escolhendo um comando de execuo, como Start, no menu Debug. Observao Nem todas as linguagens de programao oferecem suporte a projetos EXE. Instale o Visual C++ se voc precisar usar este recurso. 5. Quando voc estiver depurando um executvel sem o cdigo fonte, os recursos de depurao disponveis so limitados, anexando a um executvel em execuo ou adicionando o executvel a uma soluo Visual Studio. Se o executvel foi criado sem informaes de depurao em um formato compatvel, os recursos disponveis sero mais limitados. Se voc tiver o cdigo fonte, a melhor abordagem importar o cdigo-fonte no Visual Studio e criar um compilao para depurao do executvel no Visual Studio.
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).
Visual C# Consolidado
533
3. 4. 5. 1. 2. 3. 4. 5. 6.
Se o disco no Autorun, localize e execute o arquivo de instalao: Bem-vindo Kit CD\Source Code\CDROM_FILES\install.exe Para procurar fonte Code Center Premium, inicie o Internet Explorer e digite: https://codepremium.msdn.microsoft.com Navegue at localizar o cdigo fonte que deseja. Especifique um diretrio local para a fonte compartilhada segura Code Center Premium, conforme descrito abaixo. Inicie o Visual Studio. A partir do menu Tools, escolha Options. Na caixa de dilogo Options, abra o n Debugging e selecione Symbols. Na caixa Symbol File Locations, adicione o seguinte local: https://codepremium.msdn.microsoft.com/symbols Na caixa Cache symbols from symbol servers in this directory, digite um local onde Code Center Premium pode armazenar smbolos. Por exemplo:
c:\symbols
Se voc anteriormente tiver armazenado smbolos no mesmo local, talvez no precise limpar o cache, o qual pode conter verses mais antigas dos smbolos sem informaes Code Center Premium. 7. 8. 9. Abra o projeto no Visual Studio. No Solution Explorer, clique com o boto direito do mouse no nome da soluo e escolha Properties a partir do menu de atalho. Na caixa de dilogo Solution Property Pages, abra o n de propriedades comuns e selecione Debug Source Files.
10. Entre na caixa Directories containing source code, digite o local do cdigo fonte Code Center Premium. Voc pode localizar a origem por navegao https://codepremium.msdn.microsoft.com no Internet Explorer, copiando o local de sua barra de endereos do Internet Explorer. O local que voc digita deve ser como este: https://codepremium.msdn.microsoft.com/Source/windows XP/SP1 (Este exemplo para cdigo fonte Windows XP SP1.) 11. Clique em OK. 12. Quando voc comear a depurao fonte Code Center Premium e o depurador inserir o modo de interrupo, uma caixa de dilogo solicita que voc digite o nmero SmartCard PIN. 13. Digite o nmero PIN que voc recebeu com o Code Center Premium Welcome Kit. O depurador baixa a fonte Code Center Premium. Especificando o Diretrio Local para Code Center Premium Source Antes que voc possa depurar a Code Center Premium secure shared source, voc deve especificar um diretrio local para a fonte em sua mquina. Voc pode alterar este local, editando uma chave do registro.
Para alterar o diretrio local padro para code center premium source Visual C# Consolidado 534
1. 2.
Saia do Visual Studio, se ele estiver sendo executado. No prompt de comando do Windows, digite:
regedt32
3. 4. 5.
Na janela Registry Editor , abra: HKEY_CURRENT_USER\Software\MSFT\VisualStudio\8.0\Debugger Na coluna Name, clique duas vezes em SecureSourceLocalDirectory. Edite a Value data (inicialmente uma seqncia vazia) para o local desejado para usar como um diretrio local. Se voc alterar as configuraes IDE do Visual Studio, voc pode precisar repetir este processo.
Como: Depurar um aplicativo de confiana parcial Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic Sim Sim Sim C# Sim Sim Sim C++ No No No J# Sim No Sim
Se aplica a aplicaes Windows e de console. No vlido para dispositivos inteligentes. Implantao de ClickOnce torna fcil de implantar aplicativos parcialmente confiveis que se beneficiam de Code Access Security para limitar o acesso a recursos em uma mquina. Depurar um aplicativo confiana parcial-pode ser um desafio, aplicativos de confiana parcial tem diferentes permisses de segurana (e portanto tem um comportamento diferente) dependendo da onde eles esto instalados. Se instalado a partir da Internet, um aplicativo com confiana parcial ter algumas permisses. Se instalado de uma intranet local, ter mais permisses, e se instalado no computador local, ela ter permisses totais. Voc tambm pode ter personalizado zonas, com permisses personalizadas. Convm depurar um aplicativo com confiana parcial em qualquer ou todas essas condies. Felizmente, Visual Studio facilita isso tambm. Antes de iniciar uma sesso de depurao no Visual Studio, voc pode escolher a zona que voc deseja simular um aplicativo instalado. Quando voc iniciar a depurao, o aplicativo ter permisses apropriadas para um aplicativo com confiana parcial instalado a partir dessa zona. Isso permite que voc veja o comportamento do aplicativo como ele apareceria a um usurio que baixou ele da zona. Se o aplicativo tenta executar uma ao que no tem permisso, ocorrer uma exceo. Nesse momento, o assistente de exceo oferece a oportunidade de adicionar uma permisso extra que permite voc reiniciar a sesso de depurao com permisses suficientes para evitar o problema. Posteriormente, voc poder voltar atrs e consultar quais permisses voc adicionou durante a depurao. Se voc teve que adicionar uma permisso durante a depurao, provavelmente isso indica que voc precisar adicionar um User Consent Prompt nesse ponto no seu cdigo.
Visual C# Consolidado
535
Observao Visualizadores do depurador exigem maior privilgios que so permitidos por um aplicativo parcialmente confivel. Visualizadores no sero carregados quando voc est parado no cdigo com confiana parcial. Para depurar usando um visualizador, voc deve executar o cdigo com confiana total. Para escolher uma zona para seu aplicativo com confiana parcial 1. 2. 3. 4. No menu Project escolha Projectname Properties. Nas pginas da propriedade Projectnameclique na pgina Security. Selecione Enable ClickOnce Security Settings. Em Zone your application will be installed from, clique na caixa de listagem e escolha a zona que voc deseja simular o aplicativo que est sendo instalado. A grade Permissions required by the application mostra todas as permisses disponveis. A marca de seleo indica permisses concedidas ao seu aplicativo 5. 6. 1. 2. 3.
o
Se a zona que voc escolher for (Custom), selecione correto as configuraes personalizadas na coluna Setting da grade Permissions. Clique OK para fechar as pginas de propriedades. A caixa de dilogo Exception Assistant ser exibida com a mensagem: SecurityException
was unhandled.
Para adicionar uma permisso extra quando uma exceo de segurana ocorre
Na caixa de dilogo Exception Assistant em Actions, clique em Add Permission to the Project. A caixa de dilogo Restart Debug ser exibida. Se voc desejar reiniciar a sesso de depurao com a nova permisso, clique em Yes. Se voc no desejar reiniciar ainda, clique em No. No menu Project escolha Projectname Properties. Nas pginas de propriedades Projectname clique na pgina Security. Procure na grade Permissions required by the application. Qualquer permisso extra que voc adicionou possui dois cones na coluna Included: a marca de seleo normal, que todas permisses includas possuem e um cone adicional que parece com um balo contendo a letra " i ". Use a barra de rolagem vertical para exibir a grade inteira Permissions required by the application.
4.
Como: depurar um aplicativo de cluster remoto Este tpico se aplica a: Edio do Visual Studio Express Visual Basic No C# No C++ No J# No Visual Web Developer No
Visual C# Consolidado
536
No No
No No
No Sim
No No
No No
O Visual Studio agora oferece suporte a depurao de cluster MPI. Esse recurso permite que voc depure programas paralelos executados em um cluster de computadores que se comunicam atravs da Message Passing Interface (MPI). Pr-requisitos para depurao MPI
A MPI deve ser instalada e configurada em cada mquina no cluster. A MPI est includa no Windows Server 2003, Compute Cluster Edition. Outras implementaes da MPI esto disponveis. O MPIShim.exe deve ser instalado em cada mquina no cluster. MPIShim est includo no Visual Studio 2005 e instalado com os componentes de depurao remota para ativar a depurao paralela. O MPIShim pode ser instalado em qualquer diretrio, mas deve estar no mesmo diretrio em cada mquina no cluster. Um caminho possvel :
c:\windows\system32\mpishim
Como alternativa, ele pode ser instalado em um diretrio local ao alvo de depurao.
O Remote Debugging Monitor (msvsmon) deve estar em cada mquina no cluster. Consulte Como: executar o monitor de depurao remota:. O hospedeiro do Visual Studio (o computador de onde voc est depurando) deve ser configurado com uma conta que tenha os privilgios apropriados para depurar os computadores do cluster. (Consulte Permisses de depurao remota.) 1. 2. 3. 4. 5. Abra a soluo que contm o aplicativo paralelo no Visual Studio. No Solution Explorer, clique com o boto direito do mouse no projeto e escolha Properties a partir do menu de atalho. Na caixa de dilogo Project Properties , selecione Debugging. Na caixa de listagem Debugger to Launch, escolha MPI Cluster Debugging. Na caixa MPIRun command, digite a localizao do MPIRun ou MPIExec (que inicia o aplicativo MPI) na mquina do cluster. Por exemplo:
c:\windows\system32\mpiexec.exe
6.
Na caixa MPIRun arguments, digite os argumentos que voc deseja passar para MPIRun ou MPIExec. Por exemplo:
-np 2
7.
Na caixa MPIRun working directory, digite a pasta de trabalho para MPIRun ou MPIExec. Por exemplo:
c:\temp
8.
Na caixa Application Command, digite o caminho para o aplicativo que o MPI ir executar em cada mquina cluster (que tambm o aplicativo cujo projeto est aberto no Visual Studio). O caminho pode ser um compartilhamento ou um caminho local em cada mquina no cluster. Se ele for um caminho local, o caminho deve ser idntico em cada mquina. Por exemplo:
$(TargetPath)
Visual C# Consolidado
537
9.
Na caixa Application Arguments, digite quaisquer argumentos que voc deseja passar para o aplicativo.
c:\windows\system32\mpishim
10. Na caixa MPIShim location, digite o caminho para o MPIShim.exe. Por exemplo: 11. Voc pode deixar a caixa de listagem Debugger Type definida como auto (o padro) e o depurador ir escolher o tipo de depurador correto para o cdigo que est executando. Como alternativa, voc pode escolher o tipo correto (native, managed ou mixed code) para seu aplicativo. 12. Feche a caixa de dilogo Project Properties. 13. A partir do menu Tools, escolha Options. 14. Na caixa de dilogo Options, selecione o n Debugging, categoria General. 15. Localize a caixa de seleo When one process breaks, break all other processes. Marque ou desmarque a caixa de seleo de acordo com o comportamento desejado durante a sesso de depurao. (Como essa uma opo de Tools, essa configurao permanecer em vigor para todos os projetos at voc alter-la.) Para obter mais informaes, consulte Como interromper a execuo:. 16. Clique OK para fechar a caixa de dilogo Options. Para depurar o aplicativo paralelo 1. No menu Debug, clique em Start para iniciar a depurao. Se voc tiver configurado o projeto corretamente, o aplicativo comear executando em todos os computadores no cluster. Se voc tiver definido pontos de interrupo no seu cdigo, a execuo interromper no primeiro ponto de interrupo. 2. No menu Debug, clique Windows, e clique em Processes. A janela Processes. Voc pode usar esta janela para definir um processo ativo. Para passar somente pelo nico processo ativo, use os botes na parte superior da janela. Voc pode usar DataTips para obter valores de variveis enquanto estiver depurando um aplicativo paralelo. Os valores de variveis que voc v nas DataTips sero baseados no processo ativo atual definido na janela Processes. Como: Depurar Aplicativos de 64 bits: Este tpico se aplica a: Edio do Visual Studio Express Standard Pro / Team Visual Basic Sim Sim Sim C# Sim Sim Sim C++ Sim Sim Sim J# No No No
Voc pode depurar um aplicativo de 64 bits que esteja executando no computador local ou em um computador remoto com oVisual Studio 2005.
Visual C# Consolidado
538
Se voc estiver depurando localmente, o Visual Studio 2005 executado no WOW64, o emulador de 32 bits x86 que permite que que aplicativos de 32 bits do Windows sejam executados no Windows 64-Bits.A depurao local no WOW64 suportada somente no x64 . Se voc estiver depurando remotamente, o Visual Studio 2005 pode ser executado no WOW64 ou em uma mquina de 32 bits. Voc pode depurar tanto aplicativos do IA64 e do x64, bem como aplicativos de 32 bits em execuo no modo WOW do x64 ou em plataformas de 32 bits. Para depurar um aplicativo de 64 bits que esteja executando em um computador remoto, voc precisar instalar o depurador remoto de 64 bits no computador remoto. O depurador remoto de 64 bits est disponvel no ltimo disco do seu conjunto instalao do Visual Studio 2005. Se voc depurar um aplicativo de 64 bits na mquina local, o Visual Studio 2005 usa depurao remota para realizar a conexo entre o WOW64 e o aplicativo de 64 bits na mesma mquina. Para obter mais informaes, consulte Depurao na uma plataforma de 64 bits. Os componentes de depurao remota sero instalados automaticamente quando voc instalar o Visual Studio 2005 no computador. Em ambos os casos, a instalao da depurao remota em uma mquina de 64 bits instala as verses de 32 bits e 64 bits do Monitor de Depurao Remota. Para depurar um aplicativo de 64 bits, use a verso correta, que Remote Debugger (x64) no menu Start. A depurao do cdigo de 64 bits quase idntica a depurao do cdigo de 32-bits. No entanto, existem duas diferenas:
Editar e Continuar no esto disponveis para a depurao de 64 bits. Voc no pode depurar no modo misto, realizar chamadas de cdigo nativo para cdigo gerenciado, ou vice-versa, no cdigo de 64 bits. 1. Clique em Start, aponte para All Programs, aponte para Microsoft Visual Studio 2005, aponte para Visual Studio Tools, e clique em Remote Debugger (x64) ou Remote Debugger (IA64) OuNo Command Prompt do Windows, execute o comando Install path\Microsoft Visual Studio 8\Common7\IDE\Remote Debugger\x64 ou o comando Install path\Microsoft Visual Studio 8\Common7\IDE\Remote Debugger\ia64. 2.
o o
Configure a Remote Debugging Monitor para depurao remota Para configurar a depurao remota no Windows Authentication mode, consulte Como configurar modo Autenticao do Windows:. Para configurar a depurao remota, somente para cdigo nativo, no No Authentication mode, consulte Como: Configurar " sem autenticao " modo. O modo No Authentication mode permite uma depurao mais rpida em redes lentas, mas ele no seguro e deve ser usado somente em redes seguras.
Visual C# Consolidado
539
No No No
O Visual Studio 2005 pode ser executado em uma plataforma de 64 bits x64 no WOW64, que o emulador de 32 bits x86 que permite que aplicativos do Windows de 32 bits sejam executados no Windows de 64 bits. O Visual Studio 2005 no d suporte a IA64 WOW. Voc pode depurar um aplicativo IA64, mas deve faz-lo remotamente. (Consulte Como: Depurar Aplicativos de 64 bits:.) Quando voc executa o Visual Studio 2005 no modo WOW para depurar um aplicativo de 64 bits na mesma mquina, o Visual Studio 2005 parece fazer depurao local normal. No entanto, o Visual Studio 2005 est realmente usando o mecanismo de depurao remota para conectar-se do WOW para o aplicativo de 64 bits. Portanto, todas as consideraes que se aplicam depurao remota tambm se aplicam depurao local em uma plataforma de 64 bits. Isso significa que a janela do console externo no funciona em uma plataforma de 64 bits. Para obter mais informaes sobre como depurar aplicativos de 64 bits, consulte Como depurar um despejo de aplicativos de 64 bits:.
Visual C# Consolidado
540
Diferenas no Assembly.GetCallingAssembly().FullName
Assembly.GetCallingAssembly().FullName retorna resultados diferentes, dependendo se o processo de hospedagem estiver ativado ou no. Se voc chamar Assembly.GetCallingAssembly().FullName com o processo de hospedagem ativado, ele retorna mscorlib. Se voc chamar Assembly.GetCallingAssembly().FullName com o processo de hospedagem desativado, ser
retornado o nome do aplicativo. Como: Especificar uma verso do .NET Framework para depurao O depurador Visual Studio 2005 oferece suporte a depurao de verses mais antigas do .NET Framework, bem como a verso 2.0 atual. Se voc iniciar um aplicativo no Visual Studio, o depurador sempre poder identificar a verso correta do .NET Framework para o aplicativo que voc est depurando. Se o aplicativo j est sendo executado e voc usar Attach to, o depurador pode no ser capaz de identificar uma verso mais antiga do .NET Framework. Se isso acontecer, voc receber uma mensagem de erro que diz, O depurador fez uma suposio incorreta sobre a verso do Microsoft .NET Framework que seu aplicativo estar usando. Nesses casos raros, voc pode definir uma chave do registro para indicar ao depurador a verso a ser usada. Para especificar uma verso do .NET Framework para depurao 1. Examine a pasta Windows\Microsoft .NET\Framework para localizar as verses do .NET Framework instaladas no computador. O aspecto dos nmeros de verso algo assim:
V1.1.4322
Identifique o nmero da verso correta e tome nota dele. 2. 3. 4. Iniciar o Registry Editor (Regedit). Na Registry Editor, abra a pasta HKEY_LOCAL_MACHINE. Navegue at: HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\AD7Metrics\Engine\{449EC4 CC-30D2-4032-9256-EE18EB41B62B Se a chave no existir, clique com boto direito mouse HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\AD7Metrics\Engine, e clique em New Key no menu de atalho. Nomeie a nova chave {449EC4CC-30D2-4032-9256EE18EB41B62B}. 5. Aps navegar at {449EC4CC-30D2-4032-9256-EE18EB41B62B}, procure na coluna Name, e encontre a chave CLRVersionForDebugging. 1. Se a chave no existir, clique com o boto direito do mouse em {449EC4CC-30D24032-9256-EE18EB41B62B}, e clique New String Value no menu de atalho. Ento clique o boto direito do mouse no novo valor, clique Rename, e digite CLRVersionForDebugging.
6. 7. 8. 9.
Clique duas vezes em CLRVersionForDebugging. Na caixa Edit String, digite o nmero de verso do .NET Framework na caixa Value. Por exemplo: V1.1.4322 Clique em OK. Feche o Registry Editor. Se voc ainda receber uma mensagem de erro quando voc iniciar a depurao, verifique se voc inseriu o nmero da verso corretamente no registro. Tambm verifique se voc est
Visual C# Consolidado
541
usando uma verso do .NET Framework suportada pelo Visual Studio. O depurador compatvel com o .NET Framework verso 2.0 e verses anteriores, mas pode no ser diretamente compatvel com verses futuras.
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:
Visual C# Consolidado
542
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#
Visual C# Consolidado
544
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" );
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).
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)
Visual C# Consolidado
546
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
No painel Templates, selecione Windows Application. Na caixa Name, d ao projeto um nome exclusivo (por exemplo, Walkthrough_SimpleDebug). Clique em OK. Visual Studio cria um novo projeto e exibe um novo formulrio no Windows Forms . PaDesignerra obter mais informaes, consulte Windows Forms Designer.
6. 7. 8. 9. 10.
No menu View, selecione Toolbox. Abre a caixa de ferramentas. Para obter mais informaes, consulte Caixa de ferramentas. Na caixa de ferramentas, clique sobre o controle Button e arraste o controle para a superfcie de projeto de formulrio. Solte o boto no formulrio. Na caixa de ferramentas, clique sobre o controle TextBox e arraste o controle para a superfcie de projeto de formulrio. Solte a TextBox no formulrio. Na superfcie de projeto de formulrio, clique duas vezes no boto. Isso leva voc para a pgina de cdigo. O cursor deve estar no button1_Click. Na funo button1_Click., adicione o seguinte cdigo:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";
11.
No menu Build, selecione Build Solution. O projeto deve criar-se com erros. Depurar seu formulrio
Visual C# Consolidado
547
Para depurar o formulrio do Windows criado para essa explicao passo a passo
1. Na janela de origem, clique na margem esquerda na mesma linha quo o texto foi adicionado:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";
Um ponto vermelho aparece e o texto na linha realado em vermelho. O ponto vermelho representa um ponto de interrupo. Para obter mais informaes, consulte Pontos de interrupo. Quando voc executa o aplicativo sob o depurador, o depurador interromper a execuo nesse local quando o cdigo controntado. Voc pode exibir o estado do seu aplicativo e depur-lo. 2. 3. A partir do menu Debug, escolha Start. O formulrio do Windows comea a ser executado. No formulrio do Windows, clique no boto que voc adicionou. No Visual Studio, isso leva voc para a linha onde voc define o ponto de interrupo na pgina de cdigo. Esta linha deve ser realada em amarelo. Agora voc pode exibir as variveis no seu aplicativo e controlar sua execuo. Agora o aplicativo foi interrompido quando executava, aguardando uma ao de voc. Observao Se voc tiver definido a Active Solution Configuration como Release, a execuo no ser paralisada no ponto de interrupo. Isso simula o comportamento de um programa na verso real. O crculo que marca o ponto de interrupo ir conter um ponto de interrogao branco. Se necessrio, use a caixa de dilogo Configuration Manager para alterar essa configurao novamente para Debug. 4. 5. No menu Debug, escolha Windows, em seguida Watch, e clique em Watch1. Na janela Watch1, clique em um linha em branco. Na coluna Name, digite textBox1.Text (se voc estiver usando Visual Basic, Visual C#, ou J#) ou textBox1->Text (se voc estiver usando C++), pressione ENTER. A janela Watch1 mostra o valor dessa varivel entre aspas como:
""
6.
A partir do Menu Debug, escolha Step Into. O valor de textBox1.Text muda na janela Watch1 para:
Button was clicked!
7. 8. 9. 10.
A partir do Menu Debug, escolha Continue para continuar a depurao do programa. No formulrio do Windows, clique no boto novamente. Visual Studio quebra a execuo novamente. Clique no ponto vermelho que representa o ponto de interrupo. Isso remove o ponto de interrupo do seu cdigo. A partir do Menu Debug, escolha Stop Debugging. Anexar ao seu formulrio para depurao
Visual C# Consolidado
548
No Visual Studio 2005, voc pode anexar o depurador a um processo em execuo. Se voc estiver usando um Edition Express, no h suporte para este recurso.
2.
No menu Debug, selecione Start Without Debugging. O formulrio do Windows inicia executando sob Windows, como se voc tivesse clicado duas vezes seu executvel. O depurador no est anexado.
3.
No menu Debug, selecione Attach to Process. (Este comando tambm est disponvel a partir do menuTools.) A caixa de dilogo Attach to Process ser exibida. No painel Available Processes, localize o nome do processo (Walkthrough_SimpleDebug.exe) na coluna Process e clique nele. Clique no boto Attach. No seu formulrio do Windows, clique em um e somente um boto. O depurador quebra a execuo do formulrio do Windows no ponto de interrupo.
4. 5. 6.
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() ); } }
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.
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
Visual C# Consolidado
550
- ou
Depure usando o Kernel Debugger do Visual Studio. 1. Localizar boot.ini na sua unidade do sistema (geralmente C:\). O arquivo boot.ini pode estar oculto e somente-leitura, portanto voc precisa usar o comando a seguir para v-lo:
dir /ASH
2.
3. 4. 1. 2.
Reinicialize o computador. Reinicie o Visual Studio e depurao. Se o Kernel Debugger conectado, voc ver uma mensagem perguntando se voc deseja para continuar a depurao. Clique no boto para continuar. Voc pode obter um User break exception(Int 3) Se isso acontecer, digite o seguinte comando KD para continuar a depurao:
gn
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.
Visual C# Consolidado
551
No
No
Nativo
No
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Quando o compilador otimiza cdigo, ele reposiciona e reorganiza os instrues, resultando em mais eficiente cdigo compilado. Devido a essa rearrangement, o depurador sempre no pode identificar o cdigo fonte que corresponde a um conjunto de instrues. Otimizao pode afetar:
Locais variveis, que podem ser removido pelo otimizador ou movido para o depurador no compreende locais. Posies dentro uma funo, que so alteradas quando o otimizador mescla blocos de cdigo. Funo nomes de quadros no pilha de chamadas, que podem ser incorreto se o otimizador mescla duas funes.
Quase sempre os quadros que voc v na pilha de chamadas so direito, no entanto, supondo que voc tenha smbolos para todos os quadros. Os quadros no pilha de chamadas podero ser incorreto se voc tiver corrupo de pilha, se voc tiver escrito em linguagem conjunto, funes ou se no houver quadros sistema operacional sem correspondncia smbolos no pilha de chamadas. Variveis globais e esttico sempre so exibidas corretamente. Portanto, layout estrutura. Se voc tiver um ponteiro para uma estrutura e o valor do ponteiro esteja correto, cada varivel de membro da estrutura mostrar o valor correto. Devido a essas limitaes, voc deve fazer a depurao usando uma verso do seu programa unoptimized se possvel. Por padro, a otimizao desativado na configurao de depurao de um programa Visual C++ e ativado na configurao Release. s vezes, entretanto, um erro pode aparecem somente em uma verso de um programa otimizado. Nesse caso, voc deve depurar o cdigo otimizado. Para ativar otimizao de um Debug criar configurao 1. Quando voc cria um novo projeto, selecionar o Win32 Debug destino. Use o Win32 Debug destino at que seu programa estiver totalmente depurado e voc estiver pronto para criar um Win32 Release destino. O compilador no No otimizar o Win32 Debug destino. Selecione o projeto no Solution Explorer. No menu View, clique em Property Pages. Na caixa Property Pages de dilogo, certifique-se Debug estar marcada na caixa Configuration de listagem drop-down. No modo de exibio Pasta no lado esquerdo, selecione a C/C pasta. Sob a pasta C++, selecione Optimization.
2. 3. 4. 5. 6.
Visual C# Consolidado
552
7.
Na lista Propriedades direita, localize Optimization. A configurao lado para ele provavelmente diz Disabled (/Od). Escolha uma das outras opes (Minimum Size (/O1), Maximum Speed (/O2) ou Custom)., Full Optimization (/Ox) Se voc escolheu a Custom opo para Optimization, agora voc pode definir opes para qualquer uma das outras propriedades mostradas na lista Propriedades
8.
Ao depurar o cdigo otimizado, aspecto na Disassembly janela para ver quais instrues realmente criado e executado. Ao definir pontos de interrupo, voc precisar estar ciente que o ponto de interrupo poder mover junto com uma instruo. Por exemplo, considere o cdigo a seguir:
for (x=0; x<10; x++)
Suponha que voc definir um ponto de interrupo nesta linha. Voc pode esperar o ponto de interrupo para ser atingido 10 vezes, mas se o cdigo otimizado, ponto de interrupo somente acertado uma vez. Que porque a primeira instruo define o valor da x como 0. O compilador reconhece que isso s tem que ser feito uma vez e move-fora do loop. Move o ponto de interrupo a ele. As instrues que comparar e incrementar x permanecer dentro do loop. Quando voc exibe a Disassembly janela automaticamente definida como instruo para maior controle, que til quando depurao atravs de cdigo otimizado. o Unidade etapa
DebugBreak e __debugbreak
Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No
Voc pode chamar a DebugBreak funo Win32 ou __debugbreak. intrnsecas em qualquer ponto no seu cdigo e DebugBreak__debugbreak ter o mesmo efeito que configurar um ponto de interrupo nesse local. Porque DebugBreak uma chamada para uma funo do sistema, depurao do sistema smbolos devem ser instalados para garantir a informao correta pilha de chamadas exibida aps quebra. Caso contrrio, as informaes exibidas pelo depurador pilha de chamadas podem estar fora por um quadro. No se voc usar __debugbreak, smbolos so necessrios.
Declaraes
Este tpico se aplica a: Visual Studio Edition Visual Basic C# C++ J#
Visual C# Consolidado
553
No No No
No No No
No No No
Uma instruo de declarao Especifica uma condio que voc espera para manter verdadeira em algum momento especfico em seu programa. Se essa condio no tem verdadeira, a declarao falhar, execuo de seu programa for interrompida, aparece. e Caixa de dilogo Falha de declarao Visual C++ oferece suporte instrues de declarao com base nas seguintes construes:
Para Declaraes MFC Programa MFC. Para ATLASSERT programas que utilizam ATL. Para Declaraes CRT programas que utilizam a biblioteca de tempo de execuo C. O ANSI Declarar funo para outros programas C/C.
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.
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
MFC fornece seu prprio conjunto de recursos para detectar vazamentos de memria em programas MFC. Para obter mais informaes, consulte Detectar Leaks de memria no MFC. Consulte tambm Conceitos Segurana do Depurador Outros recursos Depurao de cdigo nativo HOW TO: depurar cdigo assembly embutido Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. O depurador fornece duas janelas para depurar cdigo de montagem embutido, a Disassembly janela e a Registers janela. Procedimento Para depurar cdigo de montagem embutido 1. 2. Usar a Disassembly janela para exibir as instrues do conjunto. Use a Registers janela para exibir registrar contedo. Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No
Visual C# Consolidado
556
No No
No No
Nativo Nativo
No No
Se voc est depurando um programa ATL, essas tcnicas depurao podem ser de uso para voc. Nesta seo Como componentes Debug com + 1.0: Descreve como para depurar um projeto 1.0 componente COM + no Visual Studio. HOW TO: Debug chamadas QueryInterface Mostra a definio voc deve adicionar ao seu cdigo para depurar QueryInterface chamadas em ATL e os resultados. Como contagens de referncia faixa: Mostra a definio voc deve adicionar ao seu cdigo para referncia de rastreamento contagens nas ATL e os resultados. Sees relacionadas Depurao e Error Reporting funes global Lista funes na biblioteca ATL que fornecem til depurao e recursos de rastreamento. Macros depurao e relatrio de erros Lista macros na Biblioteca ATL que fornecem til depurao e recursos de rastreamento. Depurao de cdigo nativo Aborda alguns problemas comuns de depurao e tcnicas para aplicativos C e C++. Segurana do Depurador Descreve as prticas recomendadas para segurana depurao.
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.
Visual C# Consolidado
558
No No
No No
Nativo Nativo
No No
Se voc est depurando um programa que usa a biblioteca de tempo de execuo C, essas tcnicas de depurao podem ser til. Nesta seo Usar da biblioteca Debug CRT Descreve o suporte de depurao fornecido pela biblioteca do C Run-Time e fornece instrues para acessar as ferramentas. Macros do relatrio Do _RPTn fornece informaes sobre e _RPTFn macros (definidas em CRTDBG.H), que substitui o uso de printf instrues para depurao. Depurar verses de funes de alocao da pilha Discute as verses Debug especiais de funes de alocao da pilha, incluindo: como a CRT relaciona chamadas, os benefcios da chamada-las explicitamente,. Como evitar a converso, controlar os tipos separados de alocaes em blocos do cliente, e os resultados de no definio _DEBUG A pilha Debug CRT Fornece links para gerenciamento de memria e a pilha de depurao, tipos de blocos sobre a pilha de depurao, usando a pilha de depurao, estado da pilha relatrio funes, e controlar solicitaes de alocao da pilha. Depurar escrita da funo gancho Links listas para Bloco do cliente conectar funes, funes do gancho de alocao, ganchos de alocao e CRT alocaes de memria, e funes do gancho de relatrio. Sees relacionadas Depurao de cdigo nativo Aborda alguns problemas comuns de depurao e tcnicas para aplicativos C e C++. Segurana do Depurador Fornece recomendaes para depurao mais seguro.
Visual C# Consolidado
559
No No No
No No No
No No No
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?
Esta seo fornece dicas sobre depurao aplicativos COM e controles ActiveX.
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:
Ou
Se voc tiver o projeto usado para criar o executvel, iniciar depurao desse projeto. Voc pode abrir um arquivo de fonte para a DLL e definir pontos de interrupo nesse arquivo, mesmo que ele seja no fizer parte do projeto usado para criar o executvel. Para obter mais informaes, consulte Pontos de interrupo. Se voc iniciar a depurao do projeto que cria a DLL, voc deve especificar o executvel que deseja usar na depurao a DLL Para especificar um executvel para a sesso de depurao 1. 2. 3. 4. 5. No Solution Explorer, selecione o projeto que cria a DLL. Partir do View menu, escolha Property Pages. Na caixa Property Pages de dilogo, abra a Configuration Properties pasta e selecione a Debugging Categoria. Na caixa Command, especifique o nome de caminho para o continer. Por exemplo, Files\MyApplication\MYAPP.EXE C:\Program. Na caixa Command Arguments, especificar os argumentos necessrios para o executvel.
Se voc no especificar o executvel na caixa Project Property Pages de dilogo aparece quando voc inicia a depurao. o Executvel para depurao caixa de dilogo de sesses
Visual C# Consolidado
561
Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Muito usando atributos pode simplificar programao C++. Para obter mais informaes, consulte Atribudo programao conceitos.Alguns atributos so interpretados diretamente pelo compilador. Outros atributos injetar cdigo em fonte de programa, que ento compila o compilador. Esse cdigo injected torna programao fcil, reduzindo a quantidade de cdigo voc deve escrever. s vezes, no entanto, um erro pode causar seu aplicativo para falhar durante sua execuo cdigo injected. Quando isso acontece, provavelmente desejar para aspecto no cdigo injected. O Visual Studio fornece duas maneiras para que voc possa ver injected cdigo:
Voc pode exibir cdigo injected na janela Disassembly. Usando /FX, voc pode criar um arquivo de origem mesclado que contm cdigo original e injected.
A Disassembly janela mostra instrues idioma conjunto-que correspondem ao cdigo-fonte e o cdigo injetado pelos atributos. Alm disso, a Disassembly janela pode mostrar a anotao cdigo fonte-. Para ativar anotao fonte
Clique com o boto direito do mouse na Disassembly janela, e escolha Show Source Code No menu de atalho. Se souber o local de um atributo em uma janela de origem, voc pode usar o menu de atalho para localizar o cdigo injected na janela Disassembly
Para exibir cdigo injected 1. 2. 3. O depurador deve estar no modo de interrupo. Em um janela de cdigo de origem, coloque o cursor na frente do atributo cujo cdigo injected voc deseja exibir. Clique com o boto direito do mouse, e selecione Go To Disassembly a partir do menu de atalho Caso o local de atributo esteja prximo o ponto de execuo atual, voc pode selecionar a Disassembly janela a partir do Debug menu Para exibir a cdigo de desmontagem no ponto de execuo atual 1. 2. O depurador deve estar no modo de interrupo. No menu Debug, escolha Windows, e clique em Disassembly.
Visual C# Consolidado
562
Fornece instrues e requisitos sobre depurao de um aplicativo ASP.NET no momento de desenvolvimento ou quando o aplicativo j estiver implantado e em execuo. Depurao aplicativos Web ATL Server Fornece links de informaes sobre a depurao de aplicativos da Web ou de servios XML da Web criados com o ATL Server. Depurando aplicativos da Web: Erros e soluo de problemas Lista erros que voc pode encontrar durante a depurao de aplicativos da Web e sugere correes. Sees relacionadas Preparao da Depurao: Web Services XML (C++) Descreve as configuraes e comportamentos padro dos projetos de Servios da Web do ASP.NET e das chamadas de depurao para servios XML da Web a partir de aplicativos do cliente. Preparao para depurao : Aplicativos ASP.NET da Web Descreve as configuraes e comportamentos padro dos projetos de Servios da Web do ASP.NET etapas para a depurao, e de como alterar a configurao de depurao padro. Projetos Servio da Web XML depurao preparao: Descreve as configuraes e comportamentos padro dos projetos de Servios da Web do ASP.NET , ativando a depurao do ASP.NET, e de como alterar a configurao de depurao padro. Depurao no Visual Studio Fornece links para as sees maiores da documentao de depurao. Informaes incluem : novidades do depurador, definies e preparaes , pontos de interrupo , tratamento de excees, editar e continuar, cdigo gerenciado de depurao, depurao de projetos Visual C++ , depurando COM e ActiveX, depurando DLLs, depurando SQL, e as referncias a interfaces de usurios. Como depurar aplicativos da Web em um servidor remoto: Descreve requisitos de instalao para depurao remota de aplicativos da Web do ASP.NET.
Depurao SQL
Este tpico se aplica a: Visual Studio Edition Express Visual Basic No C# No C++ No J# No Visual Web Developer No
Visual C# Consolidado
563
No Sim
No Sim
No Sim
No Sim
No Sim
Com o depurador Visual Studio 2005, voc pode depurar conjuntos de mdulos do commom language runtime (CLR) gerenciados executando executando dentro do processo SQL Server 2005 em grande parte da mesma maneira que voc tem depurado stored procedures, funes, disparadores e outros tipos de objetos de banco de dados. Para obter mais informaes, consulte O que h de novo no depurador Visual Studio 2005. Nesta seo Limitaes depurao SQL Descreve restries e limitaes sobre o uso dos recursos de depurao SQL. Configurando O SQL Debugging Lista requisitos de software para depurao SQL, para o servidor e estao de trabalho, instrues para ativar depurao SQL, instalar, configurar e solucionar problemas de instalao. Depurao objetos de banco de dados SQL Fornece instrues detalhadas e exemplos para cada tipo de objeto de banco de dados SQL Server que pode ser depurado. Depurao de aplicao multi-camada de banco de dados Descreve como depurar aplicativos cujos componentes esto localizados em vrias mquinas. Sees relacionadas Viso geral sobre Ferramentas Visual Database Descreve e fornece links para tpicos em Microsoft Visual Database Tools e conexes de banco de dados e referncias. Criando objetos SQL Server 2005 em Cdigo Gerenciado Descreve como criar objetos de banco de dados SQL CLR em Visual Studio usando o tipo do projeto SQL Server.
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.");
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
C#
int I = 4; System.Diagnostics.Trace.Assert(I == 5, "I is not equal to 5.");
Observao Voc pode usar Assert com o rastreamento e depurao. Este exemplo envia a pilha de chamadas para qualquer escuta na coleo Listeners. Para obter mais informaes, consulte Declaraes em cdigo gerenciado e Mtodo Debug.Assert. COMO: Criar e inicializar Listeners (escutas) de rastreamento O Debug e Trace Classes enviar mensagens para objetos chamados escutas que receber e processar essas mensagens. Um tal escuta para obter mais informaes, consulte Rastrear Listeners., o DefaultTraceListener, criado e inicializado quando o rastreamento ou depurao ativada; automaticamente Se voc desejar Trace ou Debug Sada para ser direcionado a qualquer fontes adicionais, voc deve criar e inicializar escutas de rastreamento adicionais Os ouvintes voc criar devem refletir suas necessidades individuais. Por exemplo, convm um registro de texto de toda a sada de rastreamento. Nesse caso, voc deve criar uma escuta que escreveu todas as sadas para um novo arquivo de texto quando ativado Por outro lado, voc pode deseja exibir sada durante a execuo do aplicativo somente Nesse caso, voc pode criar uma escuta que direcionado toda a sada para uma janela do console. O EventLogTraceListener pode direcionar a sada de rastreamento para um log de eventos, e o TextWriterTraceListener pode gravar a sada de rastreamento em um fluxo. Para criar e inicializar o ouvinte de rastreamento 1. Declare o ouvinte de rastreamento. Se voc est criando o ouvinte determinado exigir qualquer outro objeto, declare-los tambm. O exemplo a seguir mostra como criar uma escuta que grave em um arquivo de texto: C#
// Creates the text file that the trace listener will write to. System.IO.FileStream myTraceLog = new System.IO.FileStream("C:\\myTraceLog.txt", System.IO.FileMode.OpenOrCreate); // Creates the new trace listener. System.Diagnostics.TextWriterTraceListener myListener = new System.Diagnostics.TextWriterTraceListener(myTraceLog);
2.
o
Emitir a sada de rastreamento. Se voc desejar a escuta para receber toda sada de rastreamento, adicione o ouvinte de rastreamento para a Listeners coleo. O exemplo a seguir mostra como adicionar a escuta para a Listeners coleo: C#
Visual C# Consolidado
566
System.Diagnostics.Trace.Listeners.Add(myListener);
- ou o
Se voc no desejar a escuta para receber a sada de rastreamento, no adicionelo coleo Listeners. Voc pode emitir sada atravs uma escuta independente da coleo Listeners chamando os mtodos de sada de escuta na prpria. O exemplo a seguir mostra como gravar uma linha em uma escuta que no esteja na coleo Listeners : C#
myListener.WriteLine( "This output will not go to the Listeners collection");
3.
Se a escuta no for um membro da coleo Listeners, talvez seja necessrio para chamar o Flush mtodo para registrar a sada. C#
// Flushes the buffers of all listeners in the Listeners collection. System.Diagnostics.Trace.Flush(); // Flushes only the buffer of myListener. myListener.Flush();
COMO: Usar TraceSource e filtros com Listeners de rastreamento Um dos novos recursos do .NET Framework verso 2.0 um sistema de rastreamento avanada. O premise bsico inalterada: mensagens de rastreamento so enviadas atravs de opes para escuta, que informou os dados para uma mdia de sada associados. Uma diferena principal para verso 2.0 rastreamentos que podem ser iniciados a instncias da classe TraceSource. Destina TraceSource a funcionar como um sistema de rastreamento avanada e pode ser usada em vez do estticos mtodos do antigos Trace e Debug Classes de rastreamento.. O familiar Trace e Debug Classes ainda existir, mas a prtica recomendada para usar a TraceSource classe para rastreamento. Este tpico descreve o uso de junto com um arquivo de configurao do aplicativo. um TraceSource possvel, embora no recomendado, a usar de rastreamento sem o uso de um arquivo de configurao. um TraceSource Para obter informaes sobre rastreamento sem um arquivo de configurao, consulte COMO: Criar e inicializar fontes de rastreamento. Para criar e inicializar a fonte de rastreamento
A primeira etapa para instrumenting um aplicativo com o rastreamento para criar uma fonte de rastreamento. Em grandes projetos com vrios componentes, voc pode criar uma fonte de rastreamento separada para cada componente. A prtica recomendada consiste em usar o nome do aplicativo para o nome da fonte de rastreamento. Isso facilitar para manter os rastreamentos diferentes separadas. O cdigo a seguir cria uma nova fonte de rastreamento (mySource). (Activity1 e chama um mtodo que rastreia eventos) As mensagens de rastreamento so gravadas pelo ouvinte de rastreamento padro.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { Activity1(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } } }
No programaticamente o cdigo no primeiro procedimento no identificar qualquer escutas de rastreamento ou filtros. O cdigo sozinho resulta nas mensagens de rastreamento sendo gravadas no ouvinte de rastreamento padro. Para configurar escutas de rastreamento especfico e seus filtros associados, edite o arquivo de configurao que corresponde ao nome do seu aplicativo. Contidas nesse arquivo, voc pode adicionar ou remover uma escuta, defina
Visual C# Consolidado
567
a propriedades e filtro para uma escuta, ou remover ouvintes. O exemplo de arquivo de configurao a seguir mostra como inicializar uma escuta de rastreamento Console e uma escuta de rastreamento do gravador de texto para a fonte de rastreamento que criado no procedimento anterior. Alm de configurar os ouvintes de rastreamento, o arquivo de configurao cria filtros para ambos os ouvintes de e cria uma opo de origem para a fonte de rastreamento. Duas tcnicas so mostradas para adicionar escutas de rastreamento: adicionando o ouvinte diretamente para a fonte de rastreamento e adicionando uma escuta coleo compartilhada escutas e depois adicion-lo pelo nome fonte de rastreamento. Os filtros identificados para os dois ouvintes so inicializados com nveis de origem diferentes. Isso resulta em algumas mensagens sendo escrito por apenas um dos dois os ouvintes.
<configuration> <system.diagnostics> <sources> <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch"> <listeners> <add name="console" type="System.Diagnostics.ConsoleTraceListener"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/> </add> <add name="myListener"/> <remove name="Default"/> </listeners> </source> </sources> <switches> <add name="sourceSwitch" value="Warning"/> </switches> <sharedListeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> </sharedListeners> </system.diagnostics> </configuration>
Para alterar o nvel no qual uma escuta grava uma mensagem de rastreamento
O arquivo de configurao inicializa as configuraes para a fonte de rastreamento no momento o aplicativo inicializado. Para alterar essas configuraes Voc deve alterar o arquivo de configurao e reiniciar o aplicativo ou programaticamente atualizar o aplicativo usando o System.Diagnostics.Trace.Refresh mtodo. O aplicativo pode alterar propriedades definidas pelo arquivo de configurao para substituir as configuraes especificadas pelo usurio dinamicamente. Por exemplo, convm garantir que mensagens importantes sempre so enviadas em um arquivo de texto, independentemente das configuraes atuais.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { Activity1(); // Change the event type for which tracing occurs. // The console trace listener must be specified // in the configuration file. First, save the original // settings from the configuration file. EventTypeFilter configFilter = (EventTypeFilter)mySource.Listeners["console"].Filter; // Then create a new event type filter that ensures // critical messages will be written. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Allow the trace source to send messages to listeners // for all event types. This statement will override // any settings in the configuration file. mySource.Switch.Level = SourceLevels.All; // Restore the original filter settings. mySource.Listeners["console"].Filter = configFilter; Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }
COMO: Criar e inicializar opo de rastreamento Para usar opes de rastreamento, voc deve primeiro cri-los e coloc-los em seu cdigo No h duas classes predefinidas do qual voc pode criar objetos Opo: a BooleanSwitch classe e a TraceSwitch classe. Voc deve usar BooleanSwitch se voc cuidado somente sobre se ou no
Visual C# Consolidado
568
aparece uma mensagem de rastreamento; voc usaria TraceSwitch se necessrio para discriminate entre nveis de rastreamento. Se voc pode definir suas prprias mensagens de depurao e associ-los com nveis de rastreamento diferente. usado um TraceSwitch Voc pode usar os dois tipos de opo com rastreamento ou depurao. Por padro, e a TraceSwitch. est desativado estiver definido como nvel TraceLevel.Off um BooleanSwitch Opes de rastreamento podem ser criado e colocada em qualquer parte do seu cdigo que pode utilizem. Embora voc possa definir nveis de rastreamento e outras opes de configurao no cdigo, recomendvel que voc usar o arquivo de configurao para gerenciar o estado de seu opes. Isso ocorre porque permite gerenciar a configurao do comutaes no sistema de configurao que voc maior flexibilidade Voc pode ativar e desativar vrias opes e alterar nveis sem recompilar o aplicativo. Para obter mais informaes, consulte Configurando opes de rastreamento. Para criar e inicializar uma opo de rastreamento 1. 2. Defina uma opo como o tipo BooleanSwitch ou tipo TraceSwitch e definir o nome e descrio da opo. Configure o comutador de rastreamento. Para obter mais informaes, consulte Configurando opes de rastreamento. O cdigo a seguir cria duas opes, um dos cada tipo: C#
System.Diagnostics.BooleanSwitch dataSwitch = new System.Diagnostics.BooleanSwitch("Data", "DataAccess module"); System.Diagnostics.TraceSwitch generalSwitch = new System.Diagnostics.TraceSwitch("General", "Entire application");
COMO: Compilar condicionalmente com rastreamento e depurao Enquanto voc est depurando um aplicativo durante o desenvolvimento, o rastreamento e depurao de sada Ir para a janela de sada no Visual Studio. No entanto, para incluir recursos de rastreamento em um aplicativo implantado, voc deve compilar os aplicativos disponveis com a TRACE diretiva compilador ativada. Isso permite que cdigo de rastreamento para ser compilado na verso de lanamento do seu aplicativo. Se voc no ativar a TRACE diretiva, todo cdigo de rastreamento ser ignorado durante a compilao e no est includa no cdigo executvel que voc ir implantar. O Rastreamento e depurao mtodos tm associados atributos condicionais. Por exemplo, se o atributo condicional para rastreamento for true, todas as instrues de rastreamento so includas dentro um conjunto (um arquivo compilado.exe ou.dll); se o Trace atributo condicional for false, as instrues de rastreamento no esto includas. Voc pode ter um ou Debug atributo condicional ativada para uma criao, ou ambos, ou nenhum. o Trace Assim, existem quatro tipos de compilao: Debug, Trace, dois, ou nenhum. Alguns compilaes de verso para implantao de produo podem conter nenhum; compilaes de depurao mais conter ambos. Voc pode especificar as configuraes do compilador do seu aplicativo de vrias maneiras:
As pginas de propriedades A linha de comando (#CONST para Visual Basic e #define (para C#))
Visual C# Consolidado
569
1. 2. 3. 4.
o
Clique com o boto direito do mouse no n no Solution Explorer projeto. Escolha Properties no menu de atalho. Na caixa Property Page de dilogo que aparece, clique na Configuration Properties guia no painel esquerdo e escolha a Build opo. Escolha as configuraes do compilador desejado. No Visual Basic, marque as caixas de seleo para as configuraes do compilador voc deseja ativar. Desmarque as caixas de seleo para configuraes voc deseja desativar. Em C#, no campo Conditional Compilation Constants, digite o nome da configurao voc deseja ativar. Visual C# Observao Para habilitar o Debug e rastreamento, digite DEBUG;TRACE (ou TRACE;DEBUG). Excluir o nome de qualquer configurao voc deseja desativar. C# diferenciar maisculas de minsculas, e os nomes Configurao devero ser maisculos.
Definir uma opo de compilador condicional na linha de comando. O compilador ir incluir rastreamento ou depurar cdigo no executvel. Por exemplo, a seguinte instruo do compilador inserida na linha de comando incluiria seu cdigo de rastreamento em um executvel compilado: Para Visual Basic: vbc /r:System.dll /d:TRACE=TRUE /d:DEBUG=FALSE MyApplication.vb No C#: csc /r:System.dll /d:TRACE /d:DEBUG=FALSE MyApplication.cs Dica Para compilar mais de um arquivo do aplicativo, deixe um espao em branco entre os nomes de arquivo, por exemplo, MyApplication1.vb MyApplication2.vb MyApplication3.vb ou MyApplication1.cs MyApplication2.cs MyApplication3.cs. O significado das diretivas compilation Conditional-usado nos exemplos acima a seguinte: Diretiva
vbc csc /r: /d:
Significado Compilador do Visual Basic Compilador C# Referencia um conjunto externo (exe ou dll) Define um smbolo de compilao condicional
Observao Voc dever soletrar Trace ou Debug com letras maisculas. Para obter mais informaes sobre os comandos de compilao condicional, digite vbc /? (para Visual Basic) ou csc /? (no C#). No prompt de comando Para obter mais informaes, consulte Criando a partir da linha de comando (C#) ou Chamar o Compiler de linha de comando (Visual Basic). Para executar usando # de compilao condicional CONST ou # definir
Digite a instruo apropriada para a linguagem de programao na parte superior do arquivo de cdigo de fonte.
Visual C# Consolidado
570
Instruo Trace #CONST = True Trace #CONST = False Debug #CONST = True Debug #CONST = False
Resultado Ativa o rastreamento Desativa o rastreamento Ativa a depurao Desativa depurao Ativa o rastreamento Desativa o rastreamento Ativa a depurao Desativa depurao
C#
Para desativar o rastreamento ou depurao 1. 2. Excluir a diretiva Compilador do seu cdigo fonte. - ou Comentrio fora a diretiva compilador. Observao Do d: quando voc est pronto para compilar, ou pode escolher Build do menu ou Build use o mtodo de linha de comando mas sem digitar para definir smbolos de compilao condicional. COMO: Criar e inicializar fontes de rastreamento Fontes de rastreamento podem ser criado e inicializado com ou sem o uso de arquivos de configurao. A abordagem recomendada consiste em usar arquivos de configurao para facilitar a reconfigurao dos rastreamentos produzido pelo rastreamento fontes em tempo de execuo. Para criar e inicializar uma fonte de rastreamento usando um arquivo de configurao 1. O cdigo de exemplo a seguir tem finalidade a executados em conjunto com um arquivo de configurao do aplicativo (mostrado na etapa 2). O arquivo de configurao inicializa as configuraes para a fonte de rastreamento no momento o aplicativo inicializado. O aplicativo pode alterar propriedades definidas pelo arquivo de configurao para substituir as configuraes especificadas pelo usurio dinamicamente. Por exemplo, convm garantir que mensagens importantes sempre so enviadas em um arquivo de texto, independentemente das configuraes atuais. O cdigo de exemplo a seguir demonstra a substituio das configuraes de arquivo para assegurar mensagens crticas so sada para os ouvintes de rastreamento. Alterar as configuraes de arquivo durante a execuo do aplicativo no altera as configuraes iniciais. Para fazer que voc deve reiniciar o aplicativo ou programaticamente atualizar o aplicativo usando o Refresh mtodo.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { Activity1(); // Change the event type for which tracing occurs. // The console trace listener must be specified // in the configuration file. First, save the original // settings from the configuration file. EventTypeFilter configFilter = (EventTypeFilter)mySource.Listeners["console"].Filter; // Then create a new event type filter that ensures // critical messages will be written. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Allow the trace source to send messages to
Visual C# Consolidado
571
listeners // for all event types. This statement will override // any settings in the configuration file. mySource.Switch.Level = SourceLevels.All; // Restore the original filter settings. mySource.Listeners["console"].Filter = configFilter; Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }
2.
Do TraceSource TraceSourceApp criar o arquivo de configurao a seguir ao inicializar no exemplo de cdigo. O arquivo de configurao para um aplicativo hospedado pelo host executvel no mesmo diretrio como o aplicativo. O nome do arquivo de configurao o nome do aplicativo com uma extenso.config. Para nosso exemplo, TraceSourceApp.exe pode ser associado com um arquivo de configurao denominado TraceSourceApp.exe.config. O exemplo de arquivo de configurao a seguir mostra como inicializar uma escuta de rastreamento Console e uma escuta de rastreamento do gravador de texto para a fonte de rastreamento que criado na etapa anterior. Alm de configurar os ouvintes de rastreamento, o arquivo de configurao cria filtros para ambos os ouvintes de e cria uma opo de origem para a fonte de rastreamento. Duas tcnicas so mostradas para adicionar escutas de rastreamento: adicionando o ouvinte diretamente para a fonte de rastreamento e adicionando uma escuta coleo compartilhada escutas e depois adicionlo pelo nome fonte de rastreamento. Os filtros identificados para os dois ouvintes so inicializados com nveis de origem diferentes. Isso resulta em algumas mensagens sendo escrito por apenas um dos dois os ouvintes.
<configuration> <system.diagnostics> <sources> <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch"> <listeners> <add name="console" type="System.Diagnostics.ConsoleTraceListener"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/> </add> <add name="myListener"/> <remove name="Default"/> </listeners> </source> </sources> <switches> <add name="sourceSwitch" value="Warning"/> </switches> <sharedListeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> </sharedListeners> </system.diagnostics> </configuration>
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."); } } }
Atributos aplicados s propriedades mencionadas na expresso no sero processados. Para o compilador C#, uma expresso geral permitido que tenha apenas acesso implcito referente instncia atual do tipo de destino a essa referncia. A expresso limitada; no nenhum acesso a aliases, locais, ou ponteiros. No cdigo C#, voc pode usar uma expresso geral entre as chaves que tenha acesso implcito ao this ponteiro para a instncia atual do apenas o tipo de destino. Por exemplo, se um objeto C# tem um substitudo ToString(), ser chamada a substituio e mostrar seu resultado o depurador em vez do Thus Padro {<typeName>}., se voc tiver substitudo ToString(), voc no precisa usar DebuggerDisplayAttribute. Se voc usar ambos, o DebuggerDisplayAttribute atributo prevalece sobre a ToString() substituio. Usando o DebuggerBrowsableAttribute Do DebuggerBrowsableAttribute Aplicar a um campo ou propriedade para especificar como o campo ou propriedade deve ser exibida na janela do depurador. O construtor para este atributo
Visual C# Consolidado
573
tem um dos valores DebuggerBrowsableState de enumerao, que especifica um dos seguintes estados:
indica Never que o membro no exibido na janela de dados. Por exemplo, usar esse valor para um campo remove o campo de hierarquia; o campo no exibido quando voc expande o tipo delimitador, clicando no sinal de mais (+) para a instncia Tipo. na DebuggerBrowsableAttribute indica Collapsed que o membro exibido mas no expandidos por padro. Esse o comportamento padro. indica RootHidden que o membro prprio no exibido, mas seus objetos constituintes sero exibidos se ele uma matriz ou coleo. Observao
O DebuggerBrowsableAttribute no oferece suporte ao Visual Basic no .NET Framework verso 2.0. Do DebuggerBrowsableAttribute o exemplo de cdigo a seguir mostra o uso de para impedir que a propriedade aps ele seja exibido na janela de depurao para a classe.
[DebuggerBrowsable(DebuggerBrowsableState.Never)] public static string y = "Test String";
Usando o DebuggerTypeProxy Use o DebuggerTypeProxyAttribute atributo quando voc precisa para significativamente e fundamentalmente altera o modo de exibio de depurao de um tipo, mas no alterar o tipo prprio. O DebuggerTypeProxyAttribute atributo usado para especificar um proxy de exibio para um tipo, permitindo que um desenvolvedor para adaptar o modo de exibio para o tipo. Esse atributo, como o DebuggerDisplayAttribute, pode ser usado no nvel do conjunto, no qual a Target propriedade caso especifica o tipo para que o proxy ser usado. O uso recomendado que este atributo especifica um tipo aninhado particular que ocorre dentro do tipo ao qual o atributo aplicado. Um avaliador expresso que oferece suporte digite visualizadores verifica para este atributo quando um tipo exibido. Se o atributo for encontrado, o avaliador expresso substituir o tipo de proxy para o tipo do atributo aplicado a exibio. Quando a janela varivel depurador exibe somente os membros do tipo proxy pblicos. estiver presente, o DebuggerTypeProxyAttribute Membros particulares no so exibidos. O comportamento da janela de dados no alterado por modos de exibio avanada atributo-. Para evitar criminais de desempenho desnecessrios, atributos do proxy de exibio no sero processados at que o objeto estiver expandido, atravs o usurio clica em sinal de mais (+) ao lado do tipo em uma janela de dados, ou atravs do aplicativo do atributo DebuggerBrowsableAttribute. Portanto, recomendvel que nenhum atributo seja aplicada ao tipo de exibio. Atributos podem e devem ser aplicadas dentro do corpo do tipo de exibio. Do DebuggerTypeProxyAttribute o exemplo de cdigo a seguir mostra o uso de para especificar um tipo a ser usado como um proxy de exibio depurador.
[DebuggerTypeProxy(typeof(HashtableDebugView))] class MyHashtable : Hashtable { private const string TestString = "This should not appear in the debug window."; internal class HashtableDebugView { private Hashtable hashtable; public const string TestStringProxy = "This should appear in the debug window."; // The constructor for the type proxy class must have a // constructor that takes the target type as a parameter. public HashtableDebugView(Hashtable hashtable) { this.hashtable = hashtable; } } }
Visual C# Consolidado
574
Exemplo Descrio O exemplo de cdigo a seguir pode ser exibido em Visual Studio 2005 Para ver os resultados da aplicao o DebuggerDisplayAttribute, DebuggerBrowsableAttribute., e DebuggerTypeProxyAttribute atributos Cdigo C#
using System; using System.Collections; using System.Diagnostics; using System.Reflection; //[assembly: DebuggerTypeProxy("MyHashtable.HashtableDebugView",TargetTypeName="MyHashtable")] class DebugViewTest { // The following constant will appear in the debug window for DebugViewTest. const string TabString = " "; // The following DebuggerBrowsableAttribute prevents the property following it // from appearing in the debug window for the class. [DebuggerBrowsable(DebuggerBrowsableState.Never)] public static string y = "Test String"; static void Main(string[] args) { MyHashtable myHashTable = new MyHashtable(); myHashTable.Add("one", 1); myHashTable.Add("two", 2); Console.WriteLine(myHashTable.ToString()); Console.WriteLine("In Main."); } } [DebuggerDisplay("{value}", Name = "{key}")] internal class KeyValuePairs { private IDictionary dictionary; private object key; private object value; public KeyValuePairs(IDictionary dictionary, object key, object value) { this.value = value; this.key = key; this.dictionary = dictionary; } } [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(HashtableDebugView))] class MyHashtable : Hashtable { private const string TestString = "This should not appear in the debug window."; internal class HashtableDebugView { private Hashtable hashtable; public const string TestString = "This should appear in the debug window."; public HashtableDebugView(Hashtable hashtable) { this.hashtable = hashtable; } [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] public KeyValuePairs[] Keys { get { KeyValuePairs[] keys = new KeyValuePairs[hashtable.Count]; int i = 0; foreach(object key in hashtable.Keys) { keys[i] = new KeyValuePairs(hashtable, key, hashtable[key]); i++; } return keys; } } } }
Como: Rastrear cdigo em um aplicativo A Trace classe permite-lhe instrumento seu aplicativo. Voc pode receber mensagens informativas do aplicativo em execuo que pode ajudar a diagnosticar problemas ou analisar o desempenho. Esta uma viso geral das etapas principais normalmente envolvidas na Usar rastreamento para analisar e corrigir possveis problemas em aplicativos implantados. Para obter mais informaes sobre como executar essas etapas, consulte o link apropriado. Para usar o rastreamento em um aplicativo 1. 2. 3. 4. Considere qual rastreamento sada ser voc deseja que receba onsite aps voc ter implantou o aplicativo. Criar um conjunto de opes. Para obter mais informaes, consulte Criando e ao inicializar opes de rastreamento. Adicionar as instrues de rastreamento ao cdigo do aplicativo. Determinar onde voc deseja a sada de rastreamento para aparecem e adicionar os ouvintes apropriados. Para obter mais informaes, consulte Criando e ao inicializar Listeners do rastreamento. Testar e depurar seu aplicativo e o cdigo de rastreamento que ele contm. Compilar o aplicativo em cdigo executvel usando um dos seguintes procedimentos:
5. 6.
Visual C# Consolidado
575
Use o Build menu juntamente com a Debug pgina da caixa Property Pages de dilogo no Solution Explorer. Use isso quando compilar no Visual Studio. - ou Do Trace uso e Debug diretivas de compilador para o mtodo de linha de comando de compilao. Para obter mais informaes, consulte Compilando condicionalmente com Rastreamento e depurao. Use isso quando compilar a partir da linha de comando. Se ocorrer um problema durante o tempo de execuo, ative a opo de rastreamento apropriada. Para obter mais informaes, consulte Configurando opes de rastreamento. O cdigo de rastreamento grava Rastrear mensagens para um destino especificado, por exemplo, uma tela, um arquivo de texto, ou um log de eventos. O tipo de escuta includo na coleo Trace.Listeners determina o destino.
7.
8.
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
Criar comutaes no cdigo. Para obter mais informaes, consulte Criando e ao inicializar opes de rastreamento. Se o projeto no contm um arquivo de configurao (App.config ou Web.config), seguida, no menu Project, selecione Add New Item. Na Visual Basic: caixa Add New Item de dilogo, escolha Application Configuration File. O arquivo de configurao do aplicativo criada e aberta. Isso um documento XML cujo elemento raiz <configuration>.
Na Visual C#: caixa Add New Item de dilogo, escolha XML File. Nome este arquivo app.config. No editor XML, aps a declarao XML, adicionar XML a seguir:
<configuration> </configuration>
Quando seu projeto compilado, o arquivo App.config copiado para a pasta de sada do projeto e renomeado applicationname. exe.config... exe.config 3. Aps a <configuration> marca, mas antes da </configuration> marca, adicione o XML apropriado para configurar comutaes. Os exemplos a seguir demonstram com uma DisplayName propriedade de TraceLevelSwitch. com uma DisplayName propriedade de DataMessageSwitch e a TraceSwitch uma BooleanSwitch
<system.diagnostics> <switches> <add name="DataMessagesSwitch" value="0" /> <add name="TraceLevelSwitch" value="0" /> </switches> </system.diagnostics>
Nessa configurao, as duas opes so logoff. 4. 5. 6. Caso voc precise ativar como qualquer inteiro diferente de 0. a BooleanSwitch, como
DataMessagesSwitch mostrado no exemplo anterior, alterar o Value
Caso voc precise ativar com a configurao Nvel apropriada (1 a 4). a TraceSwitch, como TraceLevelSwitch mostrado no exemplo anterior, alterar o Value Adicionar comentrios ao arquivo.config para que o usurio final tenha uma compreenso clara de quais valores para alterar para configurar as opes adequadamente. O exemplo a seguir mostra o cdigo final, inclusive comentrios, a aparncia:
<system.diagnostics> <switches> <!-- This switch controls data messages. In order to receive data trace messages, change value="0" to value="1" --> <add name="DataMessagesSwitch" value="0" /> <!-- This switch controls general messages. In order to receive general trace messages change the value to the appropriate level. "1" gives error messages, "2" gives errors and warnings, "3" gives more detailed error information, and "4" gives verbose trace information --> <add name="TraceLevelSwitch" value="0" /> </switches> </system.diagnostics>
Passo-a-passo: Depurao de um servio XML da Web As etapas nessa explicao passo a passo mostraro como depurar um XML Web service. Elas lhe mostraro como iniciar e parar a execuo e definir pontos de interrupo. Observao Por padro, o processo do ASP.NET, usando o Aspnet_wp.exe ou o W3wp.exe, executa sob a conta doASP.NET. Por esse motivo, voc deve ter privilgios de administrador no computador onde o ASP.NET ser executado para depur-lo. Para obter mais informaes consulte Requisitos
Visual C# Consolidado
577
do sistema ASP.NET depurao:. Observao As caixas de dilogo e comandos de menu voc v podem diferir daquelas descritas na ajuda dependendo de sua configurao ou edio ativa . Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para se preparar para essa explicao passo a passo
Se voc j tiver uma soluo aberta, feche-a. Para criar e depurar um XML Web service 1. 2. 3. A partir do menuFile, clique em New, e clique em Web Site. A caixa de dilogo New Web Site ser exibida. No painel Templates, selecione ASP.NET Web Service. Agora voc pode especificar uma pasta em sua mquina local, ou uma URL para um computador remoto. Na lista drop-down Location , selecione File System, e na caixa de texto digite o diretrio em sua mquina local onde o XML Web Service ser localizado, e especifique um nome de diretrio exclusivo, como Website1. O XML Web service ter o mesmo nome que o diretrio. Se voc quisesse, voc poderia colocar o diretrio em um servidor remoto, ou explorar outras opes, clicando no boto Browse. Na lista drop-down Language , selecione a linguagem que ser usada. Clique em OK. O Visual Studio cria um novo projeto e Exibe cdigo para o Service.cs, um modelo. 6. Clique na margem prxima linha:
' Visual Basic Return "Hello World"
4. 5.
Um ponto vermelho aparecer e o texto na linha realado em vermelho. O ponto vermelho representa um ponto de interrupo. Quando voc executa o aplicativo com o depurador, o depurador interromper a execuo nesse local quando o cdigo for atingido. Voc pode ento ver o estado do seu aplicativo e depur-lo. Para obter mais informaes, consulte Pontos de interrupo. 7. 8. 9. 10. 11. 12. Verifique se a Active Configuration a configurao do Debug. No menu Debug, selecione Start ou pressione F5. A caixa de dilogo Debugging Not Enabled ser exibida. Selecione a opo Add a new Web.config file with debugging enabled, e clique em OK. O Internet Explorer abrir, e exibir o link Hello World. Clique no link Hello World. Uma nova pgina aberta no Internet Explorer. Na nova pgina, clique no boto Invoke. Neste ponto, voc atingir o ponto de interrupo no Visual Studio. Agora voc poder avaliar variveis na janela Watch, ver variveis locais, e avanar atravs de seu cdigo. 13. No menu Debug, clique em Stop Debugging.
Visual C# Consolidado
578
Para anexar-se ao XML Web service para depurao 1. 2. No Visual Studio, voc pode anexar o depurador a um processo em execuo. O procedimento a seguir mostra como fazer isso. No projeto atual, clique na margem prxima a linha que contm o seguinte cdigo:
' Visual Basic Return "Hello World" // C# return "Hello World";
Isso define um ponto de interrupo. Voc dever ver um ponto vermelho aparecendo na margem e um realce vermelho na linha de cdigo. 3. No menu Debug, selecione Start Without Debugging. O XML Web service inicia a execuo no Internet Explorer, mas o depurador no est conectado. 4. 5. No menu Debug, selecione Attach to Process. Voc tambm pode clicar emAttach to Process no menu Tools. Clique em Show processes from all users. Observao Se voc estiver atravs de uma sesso de servio de terminal ou de rea de trabalho remota, voc tambm deve selecionar Show processes in all sessions. 6. No painel Available Processes, localize WebDev.WebServer.EXE na coluna Process, e clique nele. O processo WebDev.WebServer.EXE carrega seu cdigo e exibe-o no Internet Explorer. 7. 8. 9. Clique no boto Attach. Voc tiver anexado o depurador ao seu servio da Web em execuo. No Internet Explorer, clique na linha que diz " Hello World ". Abre uma nova pgina. Na nova pgina, clique no boto Invoke. Nesse ponto, voc atingiu o ponto de interrupo no Visual Studio. Agora voc pode avaliar variveis na janela Watch , ver locais, e avanar atravs do seu cdigo. Passo-a-passo: Depurao de um formulrio do Windows Um formulrio do Windows uma das mais comuns aplicativos gerenciados. Um formulrio do Windows cria um aplicativo do Windows padro. Voc pode concluir essa explicao passo a passo usando Visual Basic, C#, J#, ou C++. Primeiro, voc deve fechar quaisquer solues abertas. Para preparar para essa explicao passo a passo
Se voc j tiver uma soluo aberta, feche-a. (No menu File, selecione Close Solution.) Criar um novo formulrio do Windows
Em seguida, voc criar um novo formulrio do Windows. Para criar o formulrio do Windows para essa explicao passo a passo 1. No menu File, escolha New e clique Project.
Visual C# Consolidado
579
A caixa de dilogo New Project ser exibida. 2. No painel tipos de projeto, abra o n Visual C#Visual Basic, Visual J# ou Visual C++, em seguida, 1. 2. 3. 4. 5. Para Visual Basic, Visual C# ou Visual J#, selecione a Windows., em seguida, marque Windows Application no painel Templates. Para Visual C++, selecione o CLR.
No painel Templates, selecione Windows Application. Na caixa Name, d ao projeto um nome exclusivo (por exemplo, Walkthrough_SimpleDebug). Clique em OK. Visual Studio cria um novo projeto e exibe um novo formulrio no Windows Forms . PaDesignerra obter mais informaes, consulte Windows Forms Designer.
6. 7. 8. 9. 10.
No menu View, selecione Toolbox. Abre a caixa de ferramentas. Para obter mais informaes, consulte Caixa de ferramentas. Na caixa de ferramentas, clique sobre o controle Button e arraste o controle para a superfcie de projeto de formulrio. Solte o boto no formulrio. Na caixa de ferramentas, clique sobre o controle TextBox e arraste o controle para a superfcie de projeto de formulrio. Solte a TextBox no formulrio. Na superfcie de projeto de formulrio, clique duas vezes no boto. Isso leva voc para a pgina de cdigo. O cursor deve estar no button1_Click. Na funo button1_Click., adicione o seguinte cdigo:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";
11.
No menu Build, selecione Build Solution. O projeto deve criar-se com erros. Depurar seu formulrio
Para depurar o formulrio do Windows criado para essa explicao passo a passo
1. Na janela de origem, clique na margem esquerda na mesma linha quo o texto foi adicionado:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";
Um ponto vermelho aparece e o texto na linha realado em vermelho. O ponto vermelho representa um ponto de interrupo. Para obter mais informaes, consulte Pontos de interrupo. Quando voc executa o aplicativo sob o depurador, o depurador interromper a execuo nesse local quando o cdigo controntado. Voc pode exibir o estado do seu aplicativo e depur-lo. 2. 3. A partir do menu Debug, escolha Start. O formulrio do Windows comea a ser executado. No formulrio do Windows, clique no boto que voc adicionou. No Visual Studio, isso leva voc para a linha onde voc define o ponto de interrupo na pgina de cdigo. Esta linha deve ser realada em amarelo. Agora voc pode exibir as
Visual C# Consolidado
580
variveis no seu aplicativo e controlar sua execuo. Agora o aplicativo foi interrompido quando executava, aguardando uma ao de voc. Observao Se voc tiver definido a Active Solution Configuration como Release, a execuo no ser paralisada no ponto de interrupo. Isso simula o comportamento de um programa na verso real. O crculo que marca o ponto de interrupo ir conter um ponto de interrogao branco. Se necessrio, use a caixa de dilogo Configuration Manager para alterar essa configurao novamente para Debug. 4. 5. No menu Debug, escolha Windows, em seguida Watch, e clique em Watch1. Na janela Watch1, clique em um linha em branco. Na coluna Name, digite textBox1.Text (se voc estiver usando Visual Basic, Visual C#, ou J#) ou textBox1->Text (se voc estiver usando C++), pressione ENTER. A janela Watch1 mostra o valor dessa varivel entre aspas como:
""
6.
A partir do Menu Debug, escolha Step Into. O valor de textBox1.Text muda na janela Watch1 para:
Button was clicked!
7. 8. 9. 10.
A partir do Menu Debug, escolha Continue para continuar a depurao do programa. No formulrio do Windows, clique no boto novamente. Visual Studio quebra a execuo novamente. Clique no ponto vermelho que representa o ponto de interrupo. Isso remove o ponto de interrupo do seu cdigo. A partir do Menu Debug, escolha Stop Debugging. Anexar ao seu formulrio para depurao
No Visual Studio 2005, voc pode anexar o depurador a um processo em execuo. Se voc estiver usando um Edition Express, no h suporte para este recurso. Para anexar ao formulrio do Windows para depurao 1. No projeto criado acima, clique Na margem esquerda para definir mais uma vez um ponto de interrupo na linha que voc adicionou:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!" // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";
2.
No menu Debug, selecione Start Without Debugging. O formulrio do Windows inicia executando sob Windows, como se voc tivesse clicado duas vezes seu executvel. O depurador no est anexado.
3.
No menu Debug, selecione Attach to Process. (Este comando tambm est disponvel a partir do menuTools.) A caixa de dilogo Attach to Process ser exibida. No painel Available Processes, localize o nome do processo (Walkthrough_SimpleDebug.exe) na coluna Process e clique nele. Clique no boto Attach.
4. 5.
Visual C# Consolidado
581
6.
No seu formulrio do Windows, clique em um e somente um boto. O depurador quebra a execuo do formulrio do Windows no ponto de interrupo.
Passo-a-passo: Depurao da funo SQL CLR definida pelo usurio com valores em tabela
Este tpico se aplica a: Edio do Visual Studio Express Standard Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim
Este exemplo mostra como depurar uma funo table-valued definida pelo usurio SQL CLR (UDF). Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na Ajuda dependendo de suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar uma funo table-valued definida pelo usurio SQL CLR 1. 2. Em um novo projeto SQL Server estabelea uma conexo a um banco de dados. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie uma nova funo usando o cdigo da primeira seo de exemplo abaixo e a nomeie TableOfPtimes.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicione um script que testa a funo, incluindo-a em uma instruo SELECT. No Solution Explorer, clique com o boto direito do mouse no diretrio TestScripts, clique em Add Test Script, e inserir o cdigo da segunda das sees de exemplo a seguir. Salve o arquivo com o nome ReadEventLog.sql. Clique com o boto direito do mouse no nome de arquivo, e clique em Set as Default Debug Script. Como voc est acessando o Event Log, voc deve alterar o Permission Level no banco de dados clicando o n do nome do projeto no Project Explorer, e clicando em Properties. Na caixa de propriedade que aparece no editor de textos, clique na guia Database, e em seguida, defina o Permission Level para Unsafe. O depurador no oferece suporte completo a depurao de assemblies inseguros. Em assemblies inseguros, voc pode criar novos segmentos e chamar cdigo no gerenciado, mas esses itens no so suportados pela depurao SQL CLR. 5. Defina pontos de interrupo no ReadEventLog.cs, e em seguida no menu Debug, clique em Start para compilar, implantar, e fazer o teste de unidade do projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparece em um ponto de interrupo, voc est depurando o cdigo SQL CLR. Experimente recursos de depurao diferentes.
3.
4.
6.
Visual C# Consolidado
582
1. 2. 3. 4.
No menu Debug, clique em Step Into repetidamente para observar a execuo linha por linha da funo. Conforme voc depura a funo, voc pode usar as janelas Locals e Watch para observar os valores dos diferentes membros. Clique em Continue novamente para concluir a depurao da funo. Na janela Output, selecione Database Output na lista suspensa Show output from, e voc pode observar os resultados da execuo das duas consultas no script TestPrims.sql.
Este exemplo mostra como depurar um disparador CLR SQL. Ele usa a tabela Contact no banco de dados de exemplo AdventureWorks, que um dos bancos de dados instalado com SQL Server 2005. O exemplo cria um novo disparador CLR inserir na tabela Contact.
Visual C# Consolidado
583
Observao As caixas de dilogo e comandos de menu voc v pode diferir daquelas descritas na ajuda dependendo de suas configuraes ativas ou verso. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um disparador CLR SQL: 1. Em um novo projeto do SQL Server, estabelecer uma conexo para o banco de dados AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Criar um novo disparador usando o cdigo da primeira seo do exemplo abaixo, e nome-lo iContact.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicionar um script que testa o disparador gerando uma ativao. No Solution Explorer clique com o boto direito do mouse no diretrio TestScripts, clique Add Test Script, e insira o cdigo da segunda seo do exemplo abaixo. Salve o arquivo com o nome truContact.sql. Clique com o boto direito do mouse no nome de arquivo e clique em Set as Default Debug Script. Defina pontos de interrupo no iContact.cs, e clique em Start do menu Debug para compilar, implantar e testar a unidade do projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer em um ponto de interrupo, voc est depurando o disparador. Experimente recursos de depurao diferentes. 1. 2. Passe a instruo instanciando o SqlTriggerContext. Abra a janela Locals. Observe que voc pode abrir a varivel triggContext, que a SqlTriggerContext, e voc pode examinar seus membros. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. Observao
2.
3.
4.
5.
O servidor pode no refletir as alteraes em valores de variveis nas janelas do depurador. Par obter mais informaes, consulte Limitaes depurao SQL. 3. 4. Escolha Step Into no menu Debug para passar uma linha na stored procedure. Observe que a execuo tem instanciado o valor da varivel sqlP do tipo SqlPipe. Abra a janela Watch. Arraste a varivel sqlP para qualquer local na janela Watch. A varivel agora adicionada lista de variveis observadas. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. Observao Voc pode editar os valores das variveis na janela Watch. 5. 6. No editor de texto, clique com o boto direito do mouse na linha ltima e clique em Insert Breakpoint. No menu Debug, clique Continue e o depurador executar o cdigo at o novo ponto de interrupo.
Visual C# Consolidado
584
6.
Clique Continue novamente para concluir a depurao do disparador. Uma mensagem aparece na janela Output informando que o disparador foi depurado com xito e exibe o resultado da execuo dos comandos no arquivo truContact.sql.
Exemplo Isso o cdigo necessrio para criar o disparador usado neste exemplo.
using System; using System.Data; using System.Data.Sql; using Microsoft.SqlServer.Server; public partial class Triggers { // Enter existing table or view for the target and uncomment the attribute line. [Microsoft.SqlServer.Server.SqlTrigger (Name="Trigger1", Target="primes", Event="FOR UPDATE")] public static void Trigger1() { SqlTriggerContext triggContext = SqlContext.TriggerContext; SqlPipe sqlP = SqlContext.Pipe; sqlP.Send("primes inserted!"); } }
Este o script de teste que far com que o disparador seja acionado.
UPDATE Person.Contact SET MiddleName = 'A' WHERE ContactID = 8
Este exemplo mostra como depurar um tipo SQL CLR definido pelo usurio. Ele cria um novo tipo SQL CLR no banco de dados de exemplo AdventureWorks. O tipo depois usado em uma definio de tabela, uma instruo INSERT, e em seguida em uma instruo SELECT. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na Ajuda dependendo de suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um tipo CLR SQL definido pelo usurio 1. Em um novo projeto do SQL Server, estabelea uma conexo com a banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie um novo tipo usando o cdigo da primeira seo exemplo abaixo, e nomeie-a Point.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:.
2.
Visual C# Consolidado
585
3.
Adicione um script que testa o tipo. No Solution Explorer, clique com o boto direito do mouse no diretrio TestScripts , clique Add Test Script, e insera o cdigo da segunda seo de exemplo abaixo. Salve o arquivo com o nome Point.sql. Clique com o boto direito do mouse no nome de arquivo, e clique em Set as Default Debug Script. Adicione pontos de interrupo. 1. 2. Na pasta Types no Server Explorer, abra Point. Insira um ponto de interrupo dentro de cada mtodo de modo que voc possa observar o fluxo de controle no interior do tipo.
4.
5.
A partir do menu Debug, escolha Start para compilar, implantar, e testar o projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer no ponto de interrupo, voc est depurando sua funo. Experimente recursos de depurao diferentes. 1. O mtodo Parse executado uma vez para cada instruo INSERT no script no Point.sql. Repetidamente clicando Step Into no Debug menu, voc pode observar como o mtodo converte um par de nmeros delimitado por dois-pontos em um objeto Point. Na janela Locals, abra a varivel pt, que contm o Point que est sendo criado atualmente. No editor de texto, clique duas vezes a varivel pt para selecion-la. Arraste pt para qualquer local na janela Watch. Agora pt adicionado lista de variveis observadas, e voc pode observ-la comforme o Point executado. Depurar a classe vrias vezes e observar as diferenas entre os caminhos de um
INSERT e um SELECT.
6.
2. 3.
4. 5. Exemplo
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; } } }
Visual C# Consolidado
586
Passo-a-passo: Depurao de uma funo SQL CLR escalar definida pelo usurio
Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim
Este exemplo mostra como depurar uma funo SQL CLR definida pelo usurio (UDF). Ele cria uma nova funo SQL CLR definida pelo usurio no banco de dados de exemplo AdventureWorks. Observao As caixas de dilogo e comandos de menu voc v podem diferir daquelas descritas na ajuda dependendo das suas configuraes ativas ou verso. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar uma funo escalar CLR SQL definida pelo usurio 1. Em um novo projeto do SQL Server, estabelea uma conexo com a banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Criar uma nova funo usando o cdigo da primeira seo do exemplo abaixo, e nome-la OrderCount.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicionar um script que testa a funo incluindo-o em uma instruo SELECT. No Solution Explorer, clique com o boto direito do mouse no diretrio TestScripts, clique Add Test Script e insira o cdigo da segunda seo do exemplo abaixo. Salve o arquivo com o nome CallOrderCount.sql. Clique com boto direito mouse no nome do arquivo e escolha Set as Default Debug Script. Coloque um ponto de interrupo no OrderCount.cs na linha que instancia um
SqlCommand, e no menu Debug, clique Start para compilar, implantar e testar a unidade do
2.
3.
4.
projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer no ponto de interrupo, voc est depurando sua funo. 5. Experimentar recursos de depurao diferentes. 1. 2. 3. Passe a instruo instanciando o SqlCommand usando Step Into a partir do menu Debug. Na janela Locals, abra a varivel sqlComm, que o SqlCommand e examine seus membros. Clique Step Into no menu Debug para passar uma linha na funo. Observe que o membro sqlComm.CommandText foi instanciado tem.
Visual C# Consolidado
587
4. 5. 6. 7. 8. Exemplo
No editor de texto, arraste sqlComm para qualquer local na janela Watch. A varivel agora adicionada lista de variveis observadas. Escolha Step Into novamente e observe que uma nova janela rotulada Dynamic TSQL abre, exibindo a instruo SQL que est prestes a ser executada. Escolha Step Into por executar a instruo e retornar para a funo. Pressione Continue novamente, e observe a segunda janela Dynamic T-SQL que abre, mostrando o cdigo que retorna o valor da funo. Pressione Continue novamente para concluir a depurao da funo.
Este exemplo mostra como depurar uma CLR SQL agregada definida pelo usurio. Ele cria uma nova funo CLR SQL agregada chamada Concatenate no banco de dados de exemplo AdventureWorks. Quando esta funo chamada em uma instruo SQL, ela ir concatenar todos os valores para coluna especificada como seu parmetro de entrada. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na Ajuda dependendo da suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio.
Visual C# Consolidado
588
Para depurar uma funo CLR SQL agregada 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie uma nova funo usando o cdigo do primeiro dos exemplo de sees a seguir e denomine-o Concatenate.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicione um script que testa a funo, incluindo-o em uma instruo SELECT. No Solution Explorer clique com o boto direito do mouse no diretrio TestScripts, selecione Add Test Script, e insira o cdigo da segunda seo de exemplo abaixo. Salve o arquivo com o nome Concatenate.sql. Clique com o boto direito do mouse no nome de arquivo, e clique em Set as Default Debug Script. Coloque um ponto de interrupo na Concatenate.cs dentro do mtodo Accumulate na instruo if. Para fazer isso, clique na margem esquerda cinza da janela do editor de texto, e no menu Debug, clique em Start, para compilar, implantar, e testar a unidade do projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer no ponto de interrupo, significa que voc est depurando sua funo. Experimente recursos de depurao diferentes. 1. O mtodo Accumulate executado uma vez para cada linha que constitui a clusula GROUP BY em script na Concatenate.sql. Repetidamente clicando Step Into no menu Debug, voc pode observar como o resultado do mtodo criado. 2. 3. Na janela Locals, abra a varivel value, que contm o nome de armazenamento atual sendo processado. Clique na varivel this. O n filho intermediateResult ser retornado dessa funo, e contm todos os nomes de armazenamento at o armazenamento presente, concatenados juntos e separados por vrgulas. No editor de texto, clique duas vezes a varivel intermediateResult para selecion-lo. Arraste intermediateResult para a janela Watch e solte-a em qualquer lugar na janela. A varivel agora adicionada lista de variveis observadas. Avane pelo mtodo vrias vezes. O valor de intermediateResult ser alterado toda vez atravs do mtodo, com um nome de armazenamento adicional concatenado at o final. Clique no ponto de quebra para remov-la, e adicione um ponto de quebra para a primeira instruo dentro do mtodo Terminate. Esse mtodo retorna o resultado para o chamador. Para avanar por ele, no menu Debug, clique em Start. Voc pode agora depurar por ele clicando Step Into no menu Debug. Pare quando voc chegar na instruo return. Clique em Continue novamente para concluir a depurao da funo.
2.
3.
4.
5.
4.
5.
6.
7. Exemplo
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()); } }
Esta seo contm exemplos demonstrando a depurao para todos os tipos de objeto de banco de dados T-SQL. No passado, os desenvolvedores T-SQL freqentemente escrevam e depuraram seus aplicativos T-SQL usando a ferramenta SQL Server Query Analyzer. Hoje, Query Analyzer foi substitudo pelo SQL Server Management Studio, que no tem o depurador. Os desenvolvedores T-SQL agora usam o depurador Visual Studio 2005 em vez disso. Os desenvolvedores tambm podem gravar seus aplicativos T-SQL no Visual Studio 2005, usando um projeto de banco de dados. Independentemente de voc escrever seu aplicativo TSQL no Visual Studio 2005 ou no, procedimentos de depurao so quase idnticos. H trs cenrios de depurao a serem considerados:
Depurao em um objeto de banco de dados T-SQL. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:.
Visual C# Consolidado
590
Execuo de um script de teste a partir do SQL Server Management Studio. Para obter mais informaes, consulte Como: Depurar T-SQL usando o SQL Server Management Studio:. Execuo de um script de teste em um projeto de banco de dados do Visual Studio 2005. Para obter mais informaes, consulte Como Develop na T-SQL com o tipo do projeto de banco de dados:.
A fim de depurar um disparador, voc deve iniciar a sesso de depurao em um procedimento armazenado. No possvel depurar um script SQL autnomo, fazer com que ele acione um disparador, e ser capaz de depurar o disparador.
Para depurar um disparador, voc define um ponto de interrupo em um procedimento armazenado que far com que o disparador seja acionado, defina um ponto de interrupo no disparador, e prossiga como descrito em Passo-a-passo: Depurao de um procedimento T-SQL armazenado. Este exemplo usa o banco de dados AdventureWorks, que tem uma tabela Sales.Currency com um disparador UPDATE disparador. O exemplo inclui um procedimento armazenado que atualiza uma linha na tabela, fazendo com que o disparador seja acionado. Defina pontos de interrupo no disparador, e atravs da execuo do procedimento armazenado com parmetros diferentes, voc pode seguir caminhos de execuo diferentes no disparador. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na ajuda dependendo de seu configuraes ou edio ativas. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um disparador SQL 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados AdventureWorks do exemplo . Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie um novo procedimento armazenado usando o cdigo da primeira seo de exemplo abaixo, e denomine-oUpdateCurrency_T_SQL. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Defina pontos de interrupo no UpdateCurrency_T_SQL. Isso opcional, porque a Depurao Direta de Banco de Dados faz com que a primeira linha do procedimento atue como um ponto de interrupo.
2.
3.
Visual C# Consolidado
591
4.
Defina pontos de interrupo para o disparador. 1. Abra o cdigo fonte do disparador, clicando com o boto direito do mouse no n Tablesn e, ento, clicando com o boto direito do mouse no n da tabela Sales.Currencye, em seguida, clicando duas vezes no cone para o disparador que chamado uCurrency. Clique com boto esquerdo do mouse na margem cinza ao lado da instruo SET NOCOUNT ON para definir um ponto de interrupo no disparador. Esta etapa no opcional : se voc no definir um ponto de interrupo no disparador, voc ir ignorar seu cdigo quando voc tentar passar por ele.
2.
5.
Entre no procedimento armazenado. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:. A caixa de dilogo Run Stored Procedure ser exibida, perguntando por valores de parmetro.
6.
Defina os valores de parmetros a seguir: 1. 2. @currencyCode= AAA @name= Um valor arbitrrio como, por exemplo,Nome do Meu Teste.
A seta amarela de um ponteiro de instruo aparece na linha SET @mynvarchar = @@VERSION, a primeira linha executvel de cdigo no procedimento armazenado. 7. Experimente recursos de depurao diferentes. 1. Depure o cdigo usando a tecla F11 ou o boto Step Into. Na instruo UPDATE, quando voc pressionar F11 novamente, voc entrar no disparador. 2. 8. Depure o disparador at que voc saia de volta ao procedimento armazenado, e continue at o fim.
Voc pode verificar os dados que foram inserido clicando com o boto direito do mouse no n Sales.Currency em Tables, e em clicando em Show Table Data no Server Explorer.
Exemplo Esse o cdigo para o procedimento armazenado que faz com que o disparador seja acionado.
ALTER PROCEDURE dbo.UpdateCurrency_T_SQL ( @currencyCode nvarchar(3), @Name nvarchar(50) ) AS SET NOCOUNT ON UPDATE Sales.Currency SET Name = @Name WHERE CurrencyCode = @currencyCode RETURN
Visual C# Consolidado
592
Este exemplo usa uma funo definida pelo usurio existente chamada de ufnGetStock no banco de dados AdventureWorks. Esta funo retorna uma contagem de itens em estoque para um determinado ProductID. O exemplo cria um procedimento armazenado que chama a funo vrias vezes. O procedimento armazenado chama a funo com parmetros diferentes, para que voc possa seguir caminhos de execuo diferentes atravs da funo. O exemplo tambm ilustra como saltar de um objeto TSQL, o procedimento armazenado, para outro, a funo. As etapas so semelhantes quelas em Passo-a-passo: Depurao de um procedimento T-SQL armazenado. Voc tambm pode fazer Direct Database Debugging (depurao de banco de dados direta) entrando na funo no Server Explorer. Para depurar uma funo definida pelo usurio 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie um novo procedimento armazenado usando o cdigo da seo de exemplo abaixo e denomine-o de Test_ufnGetStock. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Defina pontos de interrupo em Test_ufnGetStock. Isso opcional, porque a Direct Database Debugging (depurao de banco de dados direta) faz com que a primeira linha do procedimento atue como um ponto de interrupo. Defina pontos de interrupo na funo definida pelo usurio ufnGetStock. 1. 2. 5. Abra o cdigo-fonte para a funo clicando com o boto direito do mouse no n Functions no Server Explorer, depois clique duas vezes no cone ufnGetStock. Clique com o boto esquerdo do mouse na margem cinza ao lado da instruo
DECLARE para definir um ponto de interrupo.
2.
3.
4.
Entre no procedimento armazenado. Se o procedimento tivesse parmetros, a caixa de dilogo Run Stored Procedure seria exibida, perguntando por seus valores. Nesse caso, os parmetros so todos embutidos em cdigo dentro do procedimento armazenado. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:. Experimente diferentes recursos de depurao. 1. Passe pelo cdigo usando a tecla F11 ou o boto Step Into. Na instruo SELECT, quando voc pressionar F11 novamente, voc entrar na funo definida pelo usurio. Passe pela funo at que voc saia de volta para o procedimento armazenado e continue. Voc pode observar caminhos diferentes de execuo na funo de acordo com os parmetros de entrada. Voc pode ver os valores das variveis em funes definidas pelo usurio na janela Locals, ou colocando o cursor sobre elas.
6.
2.
Exemplo Isso o cdigo para o procedimento armazenado que chama a funo definida pelo usurio.
ALTER PROCEDURE Test_ufnGetStock AS SELECT dbo.ufnGetStock(1) as CurrentStock -- non-zero inventory SELECT dbo.ufnGetStock(316) as CurrentStock -- zero inventory SELECT dbo.ufnGetStock(5) as CurrentStock -- no such product
Visual C# Consolidado
593
Este tpico se aplica a: Visual Studio Edition Express Standard Pro/Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim
Este exemplo mostra como criar e depurar um procedimento armazenado T-SQL com depurao direta no banco de dados (Direct Database Debugging), em outras palavras, entrar no procedimento armazenado usando Server Explorer. Tambm ilustra diferentes tcnicas de depurao, como definio de pontos de interrupo, exibio de itens de dados, e assim por diante. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daqueles descritos na Ajuda dependendo de suas configuraes ativas ou de edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um procedimento armazenado T-SQL 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados de exemplo AdventureWorks. Para obter mais informaes consulte Como conectar-se a um banco de dados:. Crie um novo procedimento armazenado usando o cdigo da primeira seo exemplo abaixo, e denomine-o HelloWorld. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Defina pontos de interrupo em HelloWorld, e entre no procedimento armazenado. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:. O ponteiro de instruo, designado por uma seta amarela, ser exibido na da linha SET @mynvarchar = @@VERSION, a primeira linha executvel de cdigo no procedimento armazenado. Experimente diferentes recursos de depurao. 1. Torne a janela Locals visvel. Para fazer isso, no menu Debug, clique em Windows e, em seguida, clique em Locals. Observe que parmetros e variveis locais so exibidos na janela Locals com seus valores correspondentes. Voc pode editar os valores das variveis na janela Locals medida que o procedimento armazenado executado. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. Observao O servidor pode no refletir as alteraes em valores de variveis nas janelas do depurador. Para obter mais informaes, consulte Limitaes da Depurao SQL. 2. Pressione F10 para passar uma linha no procedimento armazenado. Observe que o valor da varivel @mynvarchar foi alterado na janela Locals e seu valor agora exibido em vermelho, indicando que foi alterado.
2.
3.
4.
Visual C# Consolidado
594
3.
Torne a janela Watch visvel. Para fazer isso, no menu Debug, clique em Windows, e escolha Watch. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. No editor de texto, clique duas vezes na varivel @mynvarchar para selecion-la. Arraste @mynvarchar para qualquer local na janela Watch. A varivel ento adicionada lista de variveis observadas. Observao Voc pode editar os valores das variveis na janela Watch tambm. No editor de texto, clique com o boto direito do mouse na linha Return (0), e no menu de atalho, clique em Insert Breakpoint. No menu Debug, clique em Continue.
4.
5. 6. 5.
Escolha Continue novamente para concluir a depurao do procedimento armazenado. Observao Voc pode entrar em qualquer um dos procedimentos armazenados no banco de dados AdventureWorks que so exibidos sob o n Stored Procedures associado ao banco de dados.
Visual C# Consolidado
595
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.
Visual C# Consolidado
597
Cdigo que aponta o Common Language Runtime implantado em unidades chamadas conjuntos de mdulos (assemblies). Ao tempo de carregamento, tempo de execuo examina cada conjunto para provas, que identificar informaes sobre conjunto (tais como a assinatura digital do autor o cdigo e o local que originou o cdigo). Com base nas provas, Gerenciador de segurana Runtime idioma comum mapeia montagem para um grupo de cdigos com base na diretiva de segurana. Grupos de cdigos so definidos para testar a formulrios especficos de evidncias e fazer conjuntos permisso associado a eles. Conjuntos de mdulos (assemblies) que pertencem a um grupo cdigo recebero as permisses definidas pelos conjuntos de permisses associado. Para obter mais informaes sobre provas, grupos de cdigos, e conjuntos de permisses, consulte Modelo de diretiva de segurana. Permisses As permisses so simplesmente objetos que representam o direito de acessar um recurso protegido. Permisses so configurveis e um objeto de permisso nico pode assumir vrios formulrios. Por exemplo, a FileIOPermission representa o direito de acesso, criar, ler, gravar ou modificar arquivos no disco rgido local. Para ser significativo, uma permisso deve conter informaes especficas sobre o tipo de acesso ele representa. Voc pode configurar para representar o direito para ler um arquivo especfico, ler e gravar em um arquivo especfico, ou ler os arquivos em uma pasta inteira. um FileIOPermission Os direitos que representam uma permisso e conjuntos de mdulos (assemblies) que recebe so totalmente configurveis pelo administrador do computador. Enquanto os aplicativos podem criar e configurar objetos permisso como qualquer outro objeto, somente a diretiva de segurana pode conceder permisso para um aplicativo. Basicamente, os administradores controlar a conceder permisso. Para obter uma lista de permisses comuns, consulte Permisses de acesso cdigo. Nveis de Diretiva de segurana H quatro nveis de diretiva de segurana definidas pelo modelo de segurana, que correspondem administrao diferentes e cenrios de hospedagem. A tabela a seguir descreve cada nvel. O nvel de diretiva corporativa o nvel mais alto e o nvel de domnio do aplicativo o menor. Nvel de diretiva Diretiva corporativa Diretiva da mquina Descrio Definida pelos administradores da empresa que definir a diretiva para domnios da empresa. Definida pelos administradores mquina que definir a diretiva para um computador.
Diretiva de usurio Definido por usurios que definir a diretiva para uma conta de logon nico. Diretiva de domnio de aplicativo Definido pelo host do tempo de execuo (qualquer aplicativo que hospeda o Common Language Runtime) para definir diretiva tempo carregar-. Este nvel no pode ser administrado.
Cada nvel de diretiva consiste de uma hierarquia de grupos de cdigo. Os administradores de cada nvel de diretiva pode criar seus prprios grupos de cdigos e conjuntos de permisses associado. Ao tempo de carregamento, o sistema de segurana Acesso cdigo examina todos os nveis de diretiva e a conceder permisso resultante a interseo de todas as permisses permitido em cada nvel. Os administradores de um nvel de diretiva inferior no pode loosen uma deciso diretiva feitas em um nvel superior, mas eles pode reforar Diretiva, Much como desejam. A diretiva de segurana padro reside em nvel de diretiva Mquina. As configuraes de segurana padro so:
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.
Visual C# Consolidado
599
confivel) recebe restrita acesso a recursos protegidos sob a diretiva de segurana padro. Cdigo proveniente de Internet e Intranet Local restrito de das seguintes maneiras:
Cdigo que se origina da Internet ou intranet local no tem permisso para ler ou gravar em uma unidade local. Cdigo que se origina da Internet ou intranet local no tem permisso para ler ou gravar no Registro do sistema. Cdigo que se origina da Internet ou Intranet Local pode se comunicar com o site da Web do origem. Cdigo que se origina de intranet local possui acesso irrestrito a elementos UI, mas somente cdigo originadas na Internet tem acesso sub janelas e a rea de transferncia.
A diretiva de segurana padro adequado para situaes maioria dos, mas no todos,. Voc deve considerar modificar Diretiva de segurana quando:
Voc deseja confiar um aplicativo que requer mais permisso que a zona da qual ele provm recebe por padro. Voc usar aplicativos de uma editora especfica que voc completamente confiar e deseja esses aplicativos para ter acesso a recursos especficos, no importa onde eles so executados. Voc deseja aplicativos no computador local para ter menos de confiana total. Por exemplo, voc for um administrador de empresa e voc desejar impedir que os usurios de instalar e executar aplicativos no confiveis.
Se voc decidir editar diretiva, voc deve garantir voc que no faa diminuir permisso para aplicativos para o ponto que eles no funcionaro corretamente.
Ferramentas de administrao
A maneira recomendada de configurar a diretiva de segurana para usar o Ferramenta .NET Framework Configuration (Mscorcfg.msc). Essa ferramenta fornece assistentes para ajud-lo ajustar o usurio, computador, e as configuraes de segurana corporativa. A tabela a seguir descreve esses assistentes. Assistente Confiar um aplicativo Ajustar configuraes de segurana Criar um pacote de implantao Descrio Use este assistente para identificar um aplicativo pelas informaes Editor ou nome forte e Aumentar nvel do aplicativo de confiana. Use este assistente para aumentar ou diminuir permisses a conjuntos de mdulos (assemblies) proveniente de uma das seguintes zonas: Meu computador, intranet local, Internet, sites confiveis e sites no confiveis. Use este assistente para criar um pacote Windows Installer para implantar a diretiva de segurana em uma empresa.
Para obter mais informaes sobre usando os assistentes, consulte o Ferramenta .NET Framework Configuration (Mscorcfg.msc). Se os assistentes no fornecem a funcionalidade necessrios para administrar a diretiva de segurana, voc poder editar os conjuntos de permisses e cdigo grupos diretamente usando a qualquer toolor .NET Framework Configuration o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe). Caspol.exe uma ferramenta de linha de comando fornecida principalmente para scripts administrao de segurana. Para obter informaes sobre como
Visual C# Consolidado
600
realizar tarefas especficas usando estas ferramentas consulte Configurao de diretiva de segurana.
Aumentar permisses
Um aplicativo gerenciado que requer mais permisso para executar que permite que a diretiva atual dependendo da como ele criada, ser Acione uma exceo, deixar de executar, ou funo no corretamente. Voc pode usar para exibir o permisses mnimas solicitada, permisses opcional solicitada, e permisses recusada pelo conjunto para comparar as permisses que montagem solicitaes para as permisses que ele realmente receber. o Ferramenta exibir permisses (Permview.exe) Observe que esta ferramenta s mostra permisses que tiver sido solicitada pelo aplicativo usando a sintaxe declarativa explicitamente. Com essas informaes, poder aumentar as permisses que conjunto recebe por criando um novo grupo de cdigos personalizados e associ-lo a um novo conjunto de permisso personalizada que contm todas as permisses que o aplicativo precisa ser executado corretamente. No entanto, voc deve aumentar as permisses somente se voc confiar fonte do aplicativo e somente voc deve confiar de acordo com prova que suitably confivel. Administradores (na maioria dos casos, ser ter vrios grupos de cdigos personalizados que podem ser usados para categorizar vrios aplicativos que requerem permisses semelhantes.) Suponha que voc tenha um aplicativo que freqentemente acessado por vrios usurios em um compartilhamento de rede. Em um contexto no gerenciado, essa situao no representar um problema de execuo geralmente no. No entanto, em um contexto gerenciado, este aplicativo pode ser concedido um limitado conjunto de permisses porque ele proveniente de zona Intranet local. Por exemplo, o aplicativo no pode ser permitido completo permisses de impresso, que limita utilidade deste aplicativo. Em vez de loosening as configuraes de zona inteiro da intranet local, voc deve fazer o seguinte: 1. Uso para o modo cujas permisses voc deseja aumentar as permisses mnimas solicitada pelo conjunto. o Ferramenta Exibir Permisso (Permview.exe) Essas so as permisses em log de forma mnima precisa para executar o aplicativo. Identificar uma caracterstica exclusivo da montagem. Essa caracterstica pde incluir nome forte na montagem, sua chave pblica, o hash, ou um atributo personalizado exclusivo. Se o aplicativo proveniente de um servidor confivel, o local tambm pode ser usado para identificar o aplicativo. Lembre-se, voc confia todo cdigo que tenha essa caracterstica. Criar um novo grupo de cdigos que requer o identificador exclusivo do membro. Use a ferramenta (Mscorcfg.msc).NET Framework Configuration ou Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe). Para criar o grupo de cdigos Criar um novo conjunto de permisses que inclui todas as permisses montagem em log de forma mnima precisa para executar usando a ferramenta .NET Framework Configuration ou a ferramenta Diretiva de Segurana para Acesso ao cdigo. Associar a nova permisso definir com o novo grupo cdigo, utilizando a ferramenta .NET Framework Configuration ou a ferramenta Diretiva de Segurana para Acesso ao cdigo.
2.
3.
4.
5.
O aplicativo aps a concluso dessas etapas, ser executado e receber permisses suficientes para funcionar. Outros, menos aplicativos confiveis no recebero as permisses adicionais; isso ajuda a proteger seu sistema contra cdigo mal-intencionado. Para obter informaes sobre como realizar tarefas especficas usando as ferramentas de segurana, consulte Configurao de diretiva de segurana.
Visual C# Consolidado
601
Visual C# Consolidado
602
Voc deve descrever as especificaes da permisso voc deseja adicionar ao sistema de segurana do .NET Framework quando voc adiciona ele sua diretiva personalizada. Uma permisso nico pode assumir vrios formulrios que representam o direito de acessar recursos especficos. Por exemplo, a permisso personalizada pode ter a capacidade de fornecer acesso restrito ou irrestrito a um recurso. Como um administrador, voc tem a capacidade de decidir qual tipo a permisso de acesso (restrito ou Irrestrito) representar. Portanto, voc deve descrever a configurao que voc deseja a permisso para tem que o sistema de segurana do .NET Framework. Isso, criando uma representao XML da configurao voc deseja a permisso personalizada para ter e importar o XML para a diretiva de segurana. (O sistema de segurana do .NET Framework usa XML para serializar permisses.) O editor da permisso ou deve fornecer uma ferramenta para criar a representao XML ou fornecer instrues para criar o arquivo XML. Geralmente, as representaes XML das permisses que compem a diretiva de segurana so armazenadas em arquivos de configurao de diretiva. Para adicionar uma permisso personalizada diretiva de segurana 1. 2. 3. Adicionar Conjunto implementar a permisso personalizada para o cache de conjunto de mdulos global e para a lista de conjuntos de mdulos (assemblies) totalmente confivel. Criar um arquivo XML que representa o tipo de permisso voc deseja criar e atribuir aos conjuntos. Adicionar a representao XML da permisso para a diretiva de segurana, usando o Ferramenta .NET Framework Configuration (Mscorcfg.msc) ou o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe).
Dicas de administrao
As prticas descritas na seo so aplicveis para cada cenrio Administrao. Voc deve conserv-lo em mente ao configurar e administrar a diretiva de segurana. Estratgias de longo prazo para administrao de diretiva Definir categorias de confiana que voc pode usar para administrar diretiva aplicvel. Definir vrios grupos de cdigos para discriminate cdigo que provvel que ser executada em seu ambiente e definir as permisses que devem receber cada grupo. Craft diretiva acordo e implantar. Voc deve fazer estabelecer sua diretiva geral quando voc configura seu ambiente, em vez de fone fone-por-inicialmente como necessrios para executar vrios aplicativos. Nvel de administrao O nvel de diretiva que voc escolher para administrar determinado pelo escopo que voc deseja que afetam. Sempre administrar a diretiva de segurana no nvel de diretiva menor que afeta os usurios mnimo e ainda atender seu cenrio Administrao. Por exemplo:
Se voc estiver administrando um diretiva que afeta cada estao de trabalho e usurio na sua empresa, verifique as adies Diretiva no nvel da empresa. Nunca fazer uma adio ao nvel empresa de um computador que no foi feito para afetar todos os computadores na sua empresa. Se voc estiver administrando um diretiva que afeta todos os usurios em um computador especfico, verifique as adies Diretiva no nvel da mquina. Se voc estiver administrando uma diretiva para um determinado usurio ou grupo de usurios, verifique as adies Diretiva no nvel do usurio.
Sistema de arquivos
Visual C# Consolidado
603
Usar o sistema de arquivos NTFS sempre que possvel para armazenar os arquivos de diretiva de segurana. NTFS ajuda a oferecer proteo de arquivos com base em Usurios e grupos, e somente permite que os usurios com privilgios administrativos para um nvel especfico para editar arquivos de configurao de segurana. Sistemas que no usam o sistema de arquivos NTFS criar pontos fracos de segurana, permitindo que os usurios no autorizados para modificar a diretiva de segurana.
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.
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.
Chame o mtodo esttico Protect Ao passar uma matriz de bytes para criptografar, a entropia, e o escopo proteo memria. Chame o mtodo esttico Unprotect Ao passar uma matriz de bytes para descriptografar e o escopo Proteo de memria. 1. 2. 3. 1. 2. Criar entropia aleatrio. Chame o mtodo esttico Protect Ao passar uma matriz de bytes para criptografar, a entropia, e o escopo proteo dados. Gravar os dados criptografados para um arquivo ou fluxo. Ler os dados criptografados de um arquivo ou fluxo. Chame o mtodo esttico Unprotect Ao passar uma matriz de bytes para descriptografar e o escopo proteo de dados.
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
Visual C# Consolidado
607
2. 3.
Clique na Security guia. Voc pode acessar as configuraes para a zona da Internet, zona Intranet local, sites confiveis, e Sites restritos na neste guia. Escolha a zona na qual o controle gerenciado Origem e clique no Custom Level boto. e Run ActiveX controls and plug-insScript ActiveX controls marked safe for scripting deve ser ativada para gerenciado controles ActiveX para executar ambos.
Consulte tambm
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.
Voc pode usar a GenericIdentity classe em conjunto com a GenericPrincipal classe para criar um esquema de autorizao que existe independentes de um domnio Windows NT ou Windows 2000. Para criar um objeto GenericPrincipal 1. Criar uma nova instncia da classe identidade e inicializar-lo com o nome que voc deseja que ele seja mantenha. O cdigo a seguir cria um novo GenericIdentity objeto e inicializalo com o nome MyUser. C#
GenericIdentity MyIdentity = new GenericIdentity("MyUser");
2.
Criar uma nova instncia da classe GenericPrincipal e inicializar-lo com o objeto criado GenericIdentity anteriormente e uma matriz de seqncias de caracteres que representam as funes que voc deseja associado a este objeto. O exemplo de cdigo a seguir especifica uma matriz de seqncias de caracteres que representam uma funo Administrador e uma funo do usurio. O GenericPrincipal depois est inicializado com o anterior GenericIdentity e a matriz de seqncia. C#
String[] MyStringArray = {"Manager", "Teller"}; GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray);
3.
Use o cdigo a seguir para conectar o objeto para o segmento atual. Isso importante em situaes onde o principal deve ser validado vrias vezes, ele deve ser validado pelo outros cdigo em execuo em seu aplicativo, ou ele deve ser validado por um PrincipalPermission objeto. Ainda poder realizar validao baseada em funo no objeto principal sem anex-los para o segmento. Para obter mais informaes, consulte Substituir um objeto principal. C#
Thread.CurrentPrincipal = MyPrincipal;
Exemplo O exemplo de cdigo a seguir demonstra como criar uma instncia de um GenericPrincipal e um GenericIdentity. Este cdigo exibe os valores um desses objetos para o console. C#
using System; using System.Security.Principal; using System.Threading; public class Class1 { public static int Main(string[] args) { // Create generic identity. GenericIdentity MyIdentity = new GenericIdentity("MyIdentity"); // Create generic principal. String[] MyStringArray = {"Manager", "Teller"}; GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray); // Attach the principal to the current thread. // This is not required unless repeated validation must occur, // other code in your application must validate, or the // PrincipalPermisson object is used. Thread.CurrentPrincipal = MyPrincipal; // Print values to the console. String Name = MyPrincipal.Identity.Name; bool Auth = MyPrincipal.Identity.IsAuthenticated; bool IsInRole = MyPrincipal.IsInRole("Manager"); Console.WriteLine("The Name is: {0}", Name); Console.WriteLine("The IsAuthenticated is: {0}", Auth); Console.WriteLine("Is this a Manager? {0}", IsInRole); return 0; } }
Visual C# Consolidado
609
The Name is: MyIdentity The IsAuthenticated is: True Is this a Manager? True
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.
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!
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.
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.
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. } } }
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
2.
3. 4.
Exemplo O exemplo a seguir demonstra como criar uma chave assimtrica, salv-lo em um continer de chave, recuperar a chave em uma hora posterior e excluir a chave do continer. Observe que que cdigo no mtodo GenKey_SaveInContainer e o GetKeyFromContainer mtodo semelhante. Quando voc especificar um nome continer de chave para um CspParameters objeto e transmiti-las a um AsymmetricAlgorithm objeto com a PersistKeyInCsp propriedade ou PersistKeyInCsp propriedade definida como true, ocorre o seguinte. Se um continer de chave com o nome especificado no existir, ento um criado e a chave persistente. Se um continer de chave com o nome especificado no existir, ento a chave no continer automaticamente carregado no objeto atual AsymmetricAlgorithm. Portanto, o cdigo no mtodo GenKey_SaveInContainer persiste a chave porque ele executado primeiro, enquanto o cdigo no mtodo GetKeyFromContainer carrega a chave porque ele executado segundo. C#
using System; using System.IO; using System.Security.Cryptography; public class StoreKey { public static void Main() { try { // Create a key and save it in a container. GenKey_SaveInContainer("MyKeyContainer"); // Retrieve the key from the container. GetKeyFromContainer("MyKeyContainer"); // Delete the key from the container. DeleteKeyFromContainer("MyKeyContainer"); // Create a key and save it in a container. GenKey_SaveInContainer("MyKeyContainer"); // Delete the key from the container. DeleteKeyFromContainer("MyKeyContainer"); } catch(CryptographicException e) { Console.WriteLine(e.Message); } } public static void GenKey_SaveInContainer(string ContainerName) { // Create the CspParameters object and set the key container // name used to store the RSA key pair.
Visual C# Consolidado
614
CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; // Create a new instance of RSACryptoServiceProvider that accesses // the key container MyKeyContainerName. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); // Display the key information to the console. Console.WriteLine("Key added to container: \n {0}", rsa.ToXmlString(true)); } public static void GetKeyFromContainer(string ContainerName) { // Create the CspParameters object and set the key container // name used to store the RSA key pair. CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; // Create a new instance of RSACryptoServiceProvider that accesses // the key container MyKeyContainerName. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); // Display the key information to the console. Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true)); } public static void DeleteKeyFromContainer(string ContainerName) { // Create the CspParameters object and set the key container // name used to store the RSA key pair. CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; // Create a new instance of RSACryptoServiceProvider that accesses // the key container. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); // Delete the key entry in the container. rsa.PersistKeyInCsp = false; // Call Clear to release resources and delete the key from the container. rsa.Clear(); Console.WriteLine("Key deleted."); } }
Sada
Key added to container: <RSAKeyValue> Key Information A</RSAKeyValue> Key retrieved from container : <RSAKeyValue> Key Information A</RSAKeyValue> Key deleted. Key added to container: <RSAKeyValue> Key Information B</RSAKeyValue> Key deleted.
2.
Visual C# Consolidado
615
3.
Se voc adicionar o conjunto depende do outro conjunto voc tambm deve incluir esse conjunto para a lista. (ou seja, usa tipos implementados em outro conjunto),
Adicionar um conjunto a uma lista do conjunto totalmente confivel no no garante que ele ir receber confiana total pelo sistema da diretiva como um todo, mas apenas que ele ir receber confiana total no nvel de diretiva onde ele estiver listado. Por exemplo, se voc incluir o conjunto MyCustomPermission.exe para o nvel de diretiva de usurio totalmente confivel Lista do conjunto, mas MyCustomPermission.exe recebe direitos de execuo apenas de diretiva da mquina, MyCustomPermission.exe eventualmente seria concedida apenas direitos de execuo. Portanto, importante lembrar que colocar um conjunto na lista do conjunto totalmente confivel somente ajuda evite criar resolues da diretiva circular para o nvel de diretiva onde ele estiver listado. Isso no garante que o conjunto realmente implementar a permisso personalizada recebe uma concesso confiana total.
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
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
Visual C# Consolidado
616
1.
Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2. No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja alterar a permisso para. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso cuja permisso voc deseja modificar e escolha Change Permissions. Selecione uma permisso a partir da Assigned Permissions lista e clique em Properties. A Permission Settings caixa de dilogo ser exibida, que contm informaes sobre a permisso selecionada. Altere as informaes para essa permisso e clique em OK. Clique em Finish.
2. 3. 4. 5. 6.
7.
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o conjunto de permisso voc deseja adicionar a permisso para. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso voc deseja adicionar a permisso para e escolha Change Permissions. Selecione uma permisso a partir da Available Permissions lista e clique em Add. A Permission Settings caixa de dilogo ser exibida, que contm informaes sobre a permisso selecionada. Digite as informaes necessrias para essa permisso e clique em OK.
2. 3. 4. 5. 6.
Visual C# Consolidado
617
Se voc desejar adicionar uma permisso personalizada, clique no Import boto e navegue at o arquivo XML que contm informaes sobre a permisso personalizada. 7. Quando voc tiver terminado adicionar permisses, clique em Finish.
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
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o grupo de cdigo que voc deseja modificar. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo adequada e selecione Properties. Clique na Membership Condition guia. Selecione a condio de membros voc deseja associar ao grupo de cdigos na caixa de listagem drop-down. Em seguida, siga as instrues para digitar as informaes necessrias para a condio de membro e clique em OK. Se voc deseja importar uma condio de membro de um arquivo XML, selecione (custom) na lista drop-down condio de participao. Clique Import e navegue at o arquivo XML.
2. 3. 4. 5. 6. 7.
Visual C# Consolidado
618
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.
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
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"
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o grupo de cdigo que deseja modificar. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo adequada e selecione Properties. Clique na Permission Set guia. Selecione a permisso conjunto voc deseja associar ao grupo de cdigos na lista dropdown e clique em OK.
2. 3. 4. 5. 6. 7.
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.
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
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.
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.
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.
Visual C# Consolidado
623
caspol [-enterprise|-machine|-user] -addgroup {parentLabel|parentName} mship pset_name [-exclusive {on|off}][-levelfinal {on|off}] [-name name] [-description description text] Specify the policy-level option before the addgroup option. If you omit the policy-level option, Caspol.exe adds the code group to the default policy level. For computer administrators, the default level is the machine policy level; for others, it is the user policy level. In this command:
o
The parentLabel argument is the label of the parent code group for the new code group. Alternatively, you can use the parent's code group name (parentName) instead of the parentLabel. To obtain this information, list the code groups as described in How to: View Code Groups Using Caspol.exe. The pset_name argument is the name of the permission set to associate with the new code group. Before a named permission set can be associated with a code group, it must be known at the policy level where you are adding the new code group. For example, if you want to associate a MyPset permission set with a new code group in the user policy, you must have already added the MyPset permission set to the user policy. The only time a permission set does not need to be added beforehand is when you use one of the standard permission sets provided by the .NET Framework. To learn how to add a permission set to a policy level, see How to: Add Permission Sets Using Caspol.exe. The mship argument is the membership condition for the new code group. For the list of values for the mship argument, see Code Access Security Policy Tool (Caspol.exe). Observao
You cannot use the addgroup option to add a code group to more than one level at a time. Each such addition must be made separately because different code group labels and the availability of certain permission sets can cause confusion. Sample Group Addition Commands The following procedures describe how to perform some of the most common code group addition tasks.
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
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
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
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
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
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.
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.
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja adicionar o grupo de cdigos para. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo que ser o pai imediato do novo grupo de cdigos, e escolha New. D ao grupo de cdigo um nome e, opcionalmente, uma descrio. Clique em Next. Selecione uma condio de membro na caixa drop-down. Siga as instrues para inserir as informaes solicitadas para a condio de membro. Clique em Next. Escolha um conjunto de permisses existente a partir da caixa drop-down ou selecione Create a new permission set. Clique em Next e, clique em Finish.
2. 3. 4. 5. 6. 7. 8.
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>.
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.
Visual C# Consolidado
628
Fornecedores de conjuntos podem estado que aplicativos devem usar uma verso mais recente de um conjunto, incluindo um arquivo de diretiva do editor com o conjunto atualizado. O arquivo de diretivas do editor especifica redirecionamento do conjunto e configuraes base de cdigo, e usa o mesmo formato como um arquivo de configurao do aplicativo. O arquivo de diretivas do editor compilado em um conjunto e inserido no cache de conjunto global. H trs etapas envolvidas ao criar uma diretiva do editor: 1. 2. 3. Criar um arquivo de diretivas do editor. Cria um conjunto da diretiva do editor. Incluir o conjunto da diretiva do editor para o cache de conjunto de mdulos global.
O esquema da diretiva do editor est descrita em Redirecionando verses assembly. O exemplo a seguir mostra um editor que redireciona uma verso do myAssembly para outro arquivo de diretiva.
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" /> <!-- Redirecting to version 2.0.0.0 of the assembly. --> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
Para saber como especificar uma base de cdigo, consulte Especificar local um conjunto na. Criando o conjunto da diretiva Publisher Do Vinculador do conjunto (AL.exe) uso para criar o conjunto da diretiva do editor.
Digite o seguinte comando no prompt de comando: al /link:publisherPolicyFile /out:publisherPolicyAssemblyFile /keyfile:keyPairFile Neste comando:
o o
O publisherPolicyFile argumento o nome do arquivo de diretiva do editor. O publisherPolicyAssemblyFile argumento o nome da montagem da diretiva do editor que resulta deste comando. O nome arquivo do conjunto deve seguir o formato: policy.majorNumber.minorNumber.mainAssemblyName.dll O keyPairFile argumento o nome do arquivo que contm o par de chaves. Voc dever assinar o conjunto e editor conjunto da Diretiva com o mesmo par de chaves. O seguinte comando cria um conjunto da diretiva do editor chamado policy.1.0.myAssembly a partir de um arquivo de diretiva do editor chamado pub.config, e atribui um nome de alta segurana ao conjunto usando o par de chaves no arquivo sgKey.snk.
al /link:pub.config /out:policy.1.0.myAssembly.dll /keyfile:sgKey.snk
Adicionando o conjunto da diretiva Publisher no cache do conjunto de mdulos (assembly) global Do Ferramenta Assembly Cache global (Gacutil.exe) uso para adicionar o conjunto da diretiva do editor a cache de conjunto global.
Para adicionar o conjunto da diretiva do editor a cache de conjunto global Visual C# Consolidado 629
Digite o seguinte comando no prompt de comando: gacutil /i publisherPolicyAssemblyFile O comando a seguir adiciona policy.1.0.myAssembly.dll a cache de conjunto global.
gacutil /i policy.1.0.myAssembly.dll
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.
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
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: No.NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que deseja remover um conjunto de permisses. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso voc deseja remover e escolha Delete. Observao No possvel remover conjuntos de permisso interna ou conjuntos de permisses que esto associados a um grupo de cdigos.
2. 3. 4. 5.
Visual C# Consolidado
631
o o
Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja adicionar uma permisso definida. Clique com o boto direito do mouse Permission Sets e escolha New. Dar o conjunto de permisses um nome e, opcionalmente, uma descrio. Clique em Next. Selecione uma permisso a partir da Available Permissions lista e clique em Add. A Permission Settings caixa de dilogo ser exibida, que contm informaes sobre a permisso selecionada. Digite as informaes necessrias para essa permisso e clique em OK. Se voc desejar adicionar uma permisso personalizada, clique no Import boto e navegue at o arquivo XML que contm informaes sobre a permisso personalizada.
2. 3. 4. 5. 6.
7. 8.
Repita a etapa seis at todas as permisses desejadas so adicionadas ao conjunto de permisses. Quando voc tiver terminado adicionar permisses, clique em Finish.
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o grupo de cdigo voc deseja tornar exclusivo ou final. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo que voc deseja que seja exclusivo ou final e selecione Properties. Para fazer um grupo de cdigos exclusivos, marque a caixa de seleo rotulada " Este nvel de diretiva s ter a permisses do conjunto de permisses associado a este grupo de cdigo ". OuPara fazer um nvel de grupo de cdigo final, marque a caixa de seleo rotulada " nveis de diretiva abaixo deste nvel no sero avaliados ". 7. Clique em OK.
2. 3. 4. 5. 6.
Para o sistema de segurana para avaliar diretiva em um nvel que tenha objetos de segurana que no so fornecidos com o SDK do .NET Framework, com xito o conjunto deve ter confiana total no nvel de diretiva. Do Ferramenta .NET Framework Configuration (Mscorcfg.msc) Quando voc receber um conjunto que contm um novo componente de segurana, use para adicionar o conjunto lista do conjunto totalmente confivel. Observao Colocar um conjunto na lista do conjunto totalmente confivel fornece confiana total ao conjunto somente no nvel. Se o conjunto no estiver na lista de confiana total em todos os outros nveis, o conjunto no ter confiana total mas sim a interseo da qual concedido por aqueles outros nveis. Para adicionar um conjunto lista do conjunto totalmente confivel 1. Em.NET Framework 1.0 e 1.1, na linha de comando, digite %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no .NET Framework 2.0, inicie e tipo mscorcfg.msc. A interface de usurio para a ferramenta exibida. 2. 3. 4. 5. 6. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja adicionar o novo conjunto para. Clique com o boto direito do mouse Policy Assemblies e escolha Add. Selecione o nome do conjunto a partir da lista que aparece. Esses so os conjuntos que esto em cache de conjunto global. Clique em Select.
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.
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.
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.
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 <codeBase> 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>
Visual C# Consolidado
635
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.
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
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.
Consulte tambm
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
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que deseja remover a permisso de. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso voc deseja remover a permisso de e escolha Change Permissions. Selecione uma permisso a partir da Assigned Permissions lista e clique em Remove. Clique em Finish.
2. 3. 4. 5. 6. 7.
Como: Executar tarefas de poltica de segurana comuns usando a ferramenta de configurao do .NET Framework (Mscorcfg.msc) Visual C# Consolidado 638
Do Ferramenta Configurao estrutura .NET (Mscorcfg.msc) voc pode usar para configurar a diretiva de segurana para atender s suas necessidades. A tabela a seguir descreve algumas das tarefas voc pode executar. Tarefas de diretiva de segurana Novo
Descrio Criar um novo arquivo de diretiva. Use esta opo para criar e implantar novos arquivos de nvel de diretiva sem afetar a diretiva no computador atual. Abra um nvel de diretiva. Use esta opo para abrir arquivos criados usando a New opo de diretiva. Redefinir todos os nveis de diretiva para o padro. Ajuste o nvel de segurana para cada zona. Exibir as permisses concedidas a um conjunto ou os grupos de cdigos que conceder permisses a um conjunto. Atribuir um nvel de confiana a um conjunto. Criar e implantar a diretiva de segurana em uma rede.
Abrir Redefinir tudo Ajustar Segurana Avaliar Conjunto de Mdulos (Assembly) Confiar assembly Criar um pacote de implantao
Para executar essas tarefas com base em segurana 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o
No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. No painel esquerdo, clique com o boto direito do mouse no Runtime Security Policy n. Escolha a tarefa que deseja executar a partir do menu.
2. 3.
Visual C# Consolidado
639
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(); }
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
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. } } }
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. }
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); } }
Visual C# Consolidado
642
Visual C# Consolidado
643
2. 3.
Substituir o Activate, Deactivate., e CanBePooled mtodos de classe System.EnterpriseServices.ServicedComponent Teste o objeto em pool, em um aplicativo do cliente: 1. Criar uma instncia da classe do objeto agrupada e chamar os mtodos no objeto em pool. Por exemplo, o cdigo a seguir cria uma instncia da classe TestObjectPooling e chama um Perform mtodo. C#
public class App { public static int Main(string[] args) { TestObjectPooling order = new TestObjectPooling(); order.Perform();
2.
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; } }
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(); } }
Visual C# Consolidado
645
Exemplo C#
using System.EnterpriseServices; [ assembly: ApplicationName("BankComponent")] public class Account : ServicedComponent { static void Main() {} }
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.
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."); } }
Compilando o cdigo
Visual C# Consolidado
647
2.
Aplicar o atributo AutoCompletar para cada mtodo para o qual o mtodo ContextUtil.SetComplete deve ser chamado automaticamente na ausncia de excees. O exemplo a seguir mostra como aplicar o atributo AutoCompletar. C#
[AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. }
3.
Assinar o assembly com um strong name. Do AssemblyKeyFileAttribute para assinar o conjunto usando atributos, crie um par de chaves usando Sn.exe, e adicione ou AssemblyKeyNameAttribute Conjunto atributo e especifique o nome do arquivo que contm o par de chaves para assinar o conjunto com um nome de alta segurana. C#
[assembly: AssemblyKeyFileAttribute("TestApp.snk")]
4. 5.
Registrar o conjunto que contm a classe com o catlogo COM +. Se as instncias de chamada de sua classe do cliente gerenciado pelo Common Language Runtime, o registro ser executado para voc. No entanto, se voc prev que um chamador no gerenciado pode criar e chamar instncias da sua classe, usar a ferramenta de instalao dos Servios .NET (Regsvcs.exe) para executar o Registro manualmente.
Exemplo C#
Visual C# Consolidado
648
// ----------------------------------------------------------------- // TestApp.cs // Generate a Strong name: // sn -k TestApp.snk // Compile the code: // csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs // Run TestApp: // start TestApp.exe // ----------------------------------------------------------------- using System; using System.Runtime.CompilerServices; using System.EnterpriseServices; using System.Reflection; //Registration details. //COM+ application name as it appears in the COM+ catalog. [assembly: ApplicationName("TestApp")] //Strong name for assembly. [assembly: AssemblyKeyFileAttribute("TestApp.snk")] [Transaction(TransactionOption.Required)] public class Account : ServicedComponent { //Provides SetComplete behavior in the absence of exceptions. [AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. } } public class client { public static int Main() { Account accountX = new Account(); accountX.Debit(100); return 0; } }
Como 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"); } } }
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.
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"); }
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.
4.
No aplicativo do cliente, criar uma instncia da classe do componente sem especificar uma seqncia de construo, para que o padro usado. Por exemplo, o cdigo a seguir cria
Visual C# Consolidado
652
uma instncia da classe TestObjectConstruct, e a seqncia de construo padro ser "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". C#
public class App { public static void Main() { TestObjectConstruct order = new TestObjectConstruct(); order. ConnectToDatabase(); } }
Depois de instalar o aplicativo Servios componente, voc pode especificar seqncias de construo por meio da ferramenta administrativa Servios de componente. Para inserir uma seqncia de construo de objeto para um componente, execute as seguintes etapas: 1. 2. 3. Abra a ferramenta administrativa Servios de componente. Clique com boto direito na ferramenta administrativa Servios de componente, mouse no componente que voc deseja configurar, e, em seguida, clique em Properties. Se voc no tenha definido o atributo ConstructionEnabled para True, na caixa Properties de dilogo, na guia Activation, marque a Enable object construction caixa de seleo para ativar o uso da seqncia de caracteres de construo do objeto. Se voc desejar alterar a seqncia de construo do padro especificado com o atributo ConstructionEnabled, na caixa Constructor string, insira a seqncia de construo.
4.
Exemplo C#
using System; using System.EnterpriseServices; using System.Data; using System.Data.SqlClient; [assembly : ApplicationName("OCDemo")] namespace OCDemo { [ConstructionEnabled(Default="Initial Catalog=Northwind; Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { private string connectStr; SqlConnection conn; public TestObjectConstruct() { } protected override void Construct(string constructString) { // Called after constructor. connectStr = constructString; } public void ConnectToDatabase() { conn = new SqlConnection(connectStr); conn.Open(); } } }
Visual C# Consolidado
653
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.
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
Visual C# Consolidado
655
Use o Ferramenta Configurao estrutura .NET (Mscorcfg.msc). Exibir o diretrio do cache de conjunto de mdulos global. Use o Global ferramenta cache assembly (Gacutil.exe).
Procedimentos
Para exibir os nomes de conjuntos totalmente qualificados no cache de conjunto global usando a ferramenta .NET Framework Configuration
1. 2. Clique no Start boto, aponte para Administrative Tools, e clique em Microsoft .NET Framework Configuration Clique em Manage the Assembly Cache e, clique em View List of Assemblies in the Assembly Cache.
Para obter informaes sobre como usar a ferramenta Global Assembly Cache para exibir os nomes de conjuntos, totalmente qualificados Consulte Como Visualizar o Contedo da Cache Global de Assemblies. Do Disassembler MSIL (Ildasm.exe) para conjuntos de mdulos (assemblies) que no esto no cache de conjunto global, voc pode usar cdigo para exibir as informaes para o console ou a uma varivel, ou voc pode usar para examinar metadados do conjunto, que contm o nome totalmente qualificado. Para obter mais informaes sobre como definir atributos do conjunto, como verso, cultura e nome do conjunto, consulte Definir atributos Assembly. Para obter mais informaes sobre dar um conjunto um nome de alta segurana, consulte Criando e usando assemblies de nome forte. Exemplo O exemplo de cdigo a seguir mostra como exibir o nome totalmente qualificado de um conjunto que contm uma classe especificada para o console. C#
using System; using System.Reflection; class asmname { public static void Main() { Type t = typeof(System.Data.DataSet); string s = t.Assembly.FullName.ToString(); Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", s); } } Imports System Imports System.Reflection Imports Microsoft.VisualBasic ' For a class not contained in mscorlib.dll, compile this code with ' the /r:<dllname> option; for example,compile the code below using: ' vbc asmname.vb /r:System.Data.dll /r:System.dll /r:System.Xml.dll ' If the class is contained in mscorlib.dll, the /r:<dllname> compiler option is unnecessary. Class asmname Public Shared Sub Main() Dim t As Type = GetType(System.Data.DataSet) Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", t.Assembly.FullName.ToString()) End Sub 'Main End Class 'asmname
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); } }
Type ildasm <assembly name> at the command prompt. Por exemplo, o comando a seguir desmonta o Hello.exe conjunto.
ildasm Hello.exe
Exemplo O exemplo a seguir inicia com " Um Hello, bsico " World programa. Depois compilar o programa, use Ildasm.exe para desmontar o conjunto Hello.exe e exibir o manifesto do conjunto.
Visual C# Consolidado
657
Visual Basic
Imports System Public Module modmain Sub Main() Console.WriteLine ("Hello World using Visual Basic!") End Sub End Module using System; class MainApp { public static void Main() { Console.WriteLine("Hello World using C#!"); } } #using <mscorlib.dll> using namespace System; void main() { Console::WriteLine(L"Hello World using Managed Extensions!"); }
Executando o ildasm.exe Comando no conjunto Hello.exe e duas vezes no cone MANIFEST na janela DASM IL produz o seguinte resultado:
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 1:0:2411:0 } .assembly Hello { // --- The following custom attribute is added automatically; do not uncomment. ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool, // bool) = ( 01 00 00 01 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .module Hello.exe // MVID: {58AD9DFD-63A6462A-8AD5-42CBC95AA147} .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 // Image base: 0x03330000
A tabela a seguir descreve cada diretiva no conjunto do manifesto da montagem Hello.exe usado no exemplo. Diretiva .assembly extern <assembly name> Descrio Especifica outro conjunto que contm itens referenciados pelo mdulo atual (, neste exemplo, mscorlib).
.publickeytoken <token> Especifica o smbolo da chave real da montagem referenciada. .ver <version number> .assembly <assembly name> .hash algorithm <int32 value> .ver <version number> .module <file name> .subsystem <value> Especifica o nmero de verso da montagem referenciada. Especifica o nome do conjunto. Especifica o algoritmo hash usado. Especifica o nmero de verso do conjunto. Especifica o nome dos mdulos que compem o conjunto. Neste exemplo, o conjunto consiste em apenas um arquivo. Especifica o ambiente do aplicativo necessrio para o programa. Neste exemplo, o valor 3 indica que este executvel executado de um console. Atualmente um campo reservado nos metadados.
corflags
Um manifesto do conjunto pode conter um nmero de diretivas diferentes, dependendo do contedo do conjunto. Para obter uma lista abrangente das diretivas no manifesto do conjunto, consulte a documentao ECMA, especialmente " ii partio metadados: e semntica " definio e " partio III: CIL instruo Set ". A documentao est disponvel online em http://msdn.microsoft.com/net/ECMA/ e http://www.ECMAInternational.org/publications/Standards/ECMA-335.htm.
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
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>
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.
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),
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
Visual C# Consolidado
661
.netmodule. Por exemplo, se criar um arquivo chamado Stringer espao para nome chamada myStringer que referenciado no arquivo Cdigo do cliente, Stringer deve ser compilado em um mdulo de cdigo primeiro. 2. 3. Compilar todos os outros mdulos, usando as opes do compilador necessrio para indicar os outros mdulos que so referenciados no cdigo. Do Vinculador do conjunto (AL.exe) uso para criar o arquivo de sada que contm o manifesto do conjunto. Esse arquivo contm informaes de referncia para todos os mdulos ou recursos que fazem parte do conjunto. Observao O Visual Studio 2005 IDE de C# e Visual Basic poder somente usar para criar conjuntos de Arquivo nico. Se voc desejar criar vrios arquivos conjuntos, deve usar os compiladores de linha de comando ou Visual Studio 2005 com Visual C++.. ou Visual Studio 2005 com Visual C++ O exemplo a seguir ilustra a etapa 1 do procedimento acima, por compilao arquivos com espaos para nome referido por outros arquivos. Este exemplo inicia com alguns cdigo simples para o Stringer arquivo. Espao para nome chamado myStringer com uma classe chamado StringerStringer. A Stringer classe contm um mtodo chamado StringerMethod que grava uma nica linha para o console. C#
// Assembly building example in the .NET Framework SDK. using System; namespace myStringer { public class Stringer { public void StringerMethod() { System.Console.WriteLine("This is a line from StringerMethod."); } } }
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
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.
C#
csc /t:module Stringer.cs csc Client.cs /addmodule:Stringer.netmodule
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.
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.
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
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
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
665
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),
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.
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.
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
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
2.
Visual C# Consolidado
668
1.
ou AssemblyKeyFileAttributeAssemblyKeyNameAttribute, para especificar o nome do arquivo ou recipiente que contm o par de chaves para usar ao assinar o conjunto com um nome de alta segurana. GuidAttribute Para especificar o identificador de biblioteca (LIBID) da biblioteca de tipos de destino. PrimaryInteropAssemblyAttribute Para identificar o conjunto como um conjunto interoperacional primrio. Observao Voc tambm pode atrasar assinar um conjunto durante a compilao. Para obter mais informaes, consulte Atraso assinatura um conjunto.
2. 3.
3.
O exemplo de cdigo a seguir aplica chamado CompanyA.snk com um arquivo de chave e especifica que este conjunto de mdulos (assembly) um conjunto de interoperabilidade primrio suporte verses de biblioteca tipo 4.2 e 5.2. o AssemblyKeyFileAttribute Como mostra o exemplo, voc pode dispor mais de uma verso de uma biblioteca tipo Aplicando atributos adicionais conjunto-nvel.
C#
[assembly:AssemblyKeyFile(@"..\..\CompanyA.snk")] [assembly:Guid("97d25db0-0363-1cf-abc4-02608 c9e7553"] [assembly:PrimaryInteropAssembly(4, 2)] [assembly:PrimaryInteropAssembly(5, 2)]
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
Visual C# Consolidado
669
2. 3. 4. 5.
Exemplo O exemplo a seguir mostra um servidor gerenciado como a origem de eventos e um cliente COM como o coletor de eventos. O servidor gerenciado declara ButtonEvents como uma interface do coletor de eventos e se conecta a interface a Button classe. O cliente no gerenciado cria uma instncia da classe Button e implementa a interface do coletor de eventos. Visual Basic
' Managed server (event source) Option Explicit Option Strict Imports System Imports System.Runtime.InteropServices Namespace EventSource Public Delegate Sub ClickDelegate(x As Integer, y As Integer) Public Delegate Sub ResizeDelegate() Public Delegate Sub PulseDelegate() ' Step 1: Defines an event sink interface (ButtonEvents) to be ' implemented by the COM sink. <GuidAttribute("1A585C4D-337148dc-AF8A-AFFECC1B0967"), _ InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)> _ Public Interface ButtonEvents Sub Click(x As Integer, y As Integer) Sub Resize() Sub Pulse() End Interface ' Step 2: Connects the event sink interface to a class ' by passing the namespace and event sink interface ' ("EventSource.ButtonEvents, EventSrc"). <ComSourceInterfaces(GetType(ButtonEvents))> _ Public Class Button Public Event Click As ClickDelegate Public Event Resize As ResizeDelegate Public Event Pulse As PulseDelegate Public Sub CauseClickEvent(x As Integer, y As Integer) RaiseEvent Click(x, y) End Sub Public Sub CauseResizeEvent() RaiseEvent Resize() End Sub Public Sub CausePulse() RaiseEvent Pulse() End Sub End Class End Namespace using System; using System.Runtime.InteropServices; namespace EventSource { public delegate void ClickDelegate(int x, int y); public delegate void ResizeDelegate(); public delegate void PulseDelegate(); // Step 1: Defines an event sink interface (ButtonEvents) to be // implemented by the COM sink. [GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
Visual C# Consolidado
670
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface ButtonEvents { void Click(int x, int y); void Resize(); void Pulse(); } // Step 2: Connects the event sink interface to a class // by passing the namespace and event sink interface // ("EventSource.ButtonEvents, EventSrc"). [ComSourceInterfaces(GetType(ButtonEvents))] public class Button { public event ClickDelegate Click; public event ResizeDelegate Resize; public event PulseDelegate Pulse; public Button() { } public void CauseClickEvent(int x, int y) { Click(x, y); } public void CauseResizeEvent() { Resize(); } public void CausePulse() { Pulse(); } } } ' COM client (event sink) ' This Visual Basic 6.0 client creates an instance of the Button class and ' implements the event sink interface. The WithEvents directive ' registers the sink interface pointer with the source. Public WithEvents myButton As Button Private Sub Class_Initialize() Dim o As Object Set o = New Button Set myButton = o End Sub ' Events and methods are matched by name and signature. Private Sub myButton_Click(ByVal x As Long, ByVal y As Long) MsgBox "Click event" End Sub Private Sub myButton_Resize() MsgBox "Resize event" End Sub Private Sub myButton_Pulse() End Sub
o o
2. 3.
Aplicativos COM devem ter um manifesto de aplicativo estilo Win32-para identificar o componente gerenciado.
Visual C# Consolidado
671
Componentes baseado em .NET devem ter um manifesto componente para ativao informaes necessrias em tempo de execuo.
Este tpico descreve como associar um manifesto de aplicativo a um aplicativo; associar um manifesto componente a um componente; e incorporar um manifesto componente em um conjunto. Para criar um manifesto de aplicativo 1. 2. Usando um editor XML, criar (ou modificar) manifesto de aplicativo pertencentes ao aplicativo do COM que interoperar com um ou mais componentes gerenciados. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0">
Para informaes sobre elementos manifesto e seus atributos, procure por " Reference Manifests Application " na Biblioteca do MSDN. 3. Identificar o proprietrio do manifesto. No exemplo a seguir, myComApp Verso 1 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="myOrganization.myDivision.myComApp" version="1.0.0.0" processorArchitecture="x86" />
4.
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 ".
3.
Identificar o proprietrio do arquivo. O <assemblyIdentity> elemento do elemento <dependentAssembly> no arquivo de manifesto de aplicativo deve corresponder ao nome
Visual C# Consolidado
672
no manifesto do componente. No exemplo a seguir, myManagedComp Verso 1.2.3.4 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef"
4.
Identificar cada classe no conjunto. Use o <clrClass> elemento para identificar exclusivamente cada classe no conjunto de mdulos (assembly) gerenciado. O elemento, que um subelemento do elemento <assembly> tem dos atributos descritos na tabela a seguir. Descrio O identificador que especifica a classe para ser ativado. Seqncia que informe ao usurio sobre o componente. Uma seqncia vazia o padro. Uma seqncia de caracteres que representa a classe gerenciada. O identificador a ser usado para ativao vinculados as. Required Sim No Sim No No No
threadingModel O modelo de segmentao com. "Both" o valor padro. runtimeVersion Este atributo ignorado. Se o Runtime no est carregado, a verso mais recente ser carregada antes da classe ativado. Caso contrrio, a verso atualmente carregado usada.
tlbid 5.
O identificador da biblioteca de tipos que contm informaes sobre No a classe tipo. Todas as marcas de atributo diferenciam maisculas de minsculas. Voc pode obter CLSIDs, ProgIDs, segmentao modelos, e a verso de tempo de execuo, exibindo a biblioteca de tipos exportada para o conjunto com o ObjectViewer OLE / com (Oleview.exe). O manifesto componente a seguir identifica uma classe nica com dois mtodos.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef" <clrClass clsid="{65722BE6-3449-4628-ABD374B6864F9739}" progid="myManagedComp.testClass1" threadingModel="Both" name="myManagedComp.testClass1" runtimeVersion="v1.0.3705"> </clrClass> <clrClass clsid="{367221D6-3559-3328-ABD3-45B6825F9732}" progid="myManagedComp.testClass2" threadingModel="Both" name="myManagedComp.testClass2" runtimeVersion="v1.0.3705"> </clrClass> <file name="MyManagedComp.dll"> </file> </assembly>
6.
7.
8.
Salvar e nomear o arquivo de manifesto. O nome do componente um manifesto o nome da biblioteca do conjunto seguida pela extenso.manifest. Por exemplo, o myManagedComp.dll myManagedComp.manifest.
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
Uma pista que essa funo requer um retorno de chamada a presena do argumento lpEnumFunc. comum para ver o lp prefixo (ponteiro longo) combinado com o Func sufixo do nome do argumentos que se um ponteiro para uma funo de retorno de chamada. Para obter documentao sobre funes Win32, consulte Microsoft Platform SDK. 2. Crie a funo de retorno de chamada gerenciado. O exemplo declara um tipo delegate, que utiliza dois argumentos chamado CallBack, (hwnd e lparam.) O primeiro argumento um identificador para a janela; o segundo argumento definido pelo aplicativo. Nesta verso, ambos os argumentos devem ser inteiros. Funes de retorno de chamada geralmente retornam valores diferentes de zero para indicar xito e zero para indicar falha. Este exemplo explicitamente define o valor de retorno para true para continuar a enumerao. 3. Criar um representante e transfira-como um argumento para a EnumWindows funo. Chamar plataforma converte o representante em um formato de retorno de chamada familiarizado automaticamente. Verifique o coletor de lixo que no no recuperou o representante antes a funo de retorno de chamada conclua seu trabalho. Quando voc passar um representante como um parmetro, ou passar um representante contido como um campo em uma estrutura, ela permanece uncollected para a durao da chamada. Portanto, como o caso no seguinte exemplo de enumerao, a funo de retorno de chamada completa seu trabalho antes da chamada retorna e no requer nenhuma ao adicional pelo chamador gerenciado. Se, no entanto, a funo de retorno de chamada pode ser chamada depois retorna a chamada, o chamador gerenciado dever executar etapas para garantir que o representante permanece uncollected at terminar a funo de retorno de chamada. Para
4.
Visual C# Consolidado
674
obter informaes detalhadas sobre como evitar coleta de lixo, consulte Interoperabilidade Marshaling COM Invoke Platform. Exemplo C#
using System; using System.Runtime.InteropServices; public delegate bool CallBack(int hwnd, int lParam); public class EnumReportApp { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); public static void Main() { CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0); } public static bool Report(int hwnd, int lParam) { Console.Write("Window handle is "); Console.WriteLine(hwnd); return true; } }
Use o seguinte cdigo para criar uma nova classe de exceo chamado NoAccessException e mape-lo para o HRESULT E_ACCESSDENIED. C++
Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }
Voc pode encontrar um programa (em qualquer linguagem de programao) que usa um cdigo tanto gerenciados e no gerenciados ao mesmo tempo. Por exemplo, o empacotador personalizado no exemplo de cdigo a seguir usa o Marshal.ThrowExceptionForHR(int HResult) mtodo para acionar uma exceo com um valor HRESULT especfico. O mtodo procura o HRESULT e gera o tipo de exceo apropriado. Por exemplo, o HRESULT no fragmento de cdigo a seguir gera ArgumentException. C++
CMyClass::MethodThatThrows { Marshal.ThrowExceptionForHR(COR_E_ARGUMENT); }
A tabela a seguir fornece o mapeamento completo de cada HRESULT sua classe de exceo comparvel no .NET Framework.
Visual C# Consolidado
675
HRESULT MSEE_E_APPDOMAINUNLOADED COR_E_APPLICATION COR_E_ARGUMENT ou E_INVALIDARG COR_E_ARGUMENTOUTOFRANGE COR_E_ARITHMETIC ou ERROR_ARITHMETIC_OVERFLOW COR_E_ARRAYTYPEMISMATCH COR_E_BADIMAGEFORMAT ou ERROR_BAD_FORMAT COR_E_COMEMULATE_ERROR COR_E_CONTEXTMARSHAL COR_E_CORE NTE_FAIL COR_E_DIRECTORYNOTFOUND ou ERROR_PATH_NOT_FOUND COR_E_DIVIDEBYZERO COR_E_DUPLICATEWAITOBJECT COR_E_ENDOFSTREAM COR_E_TYPELOAD COR_E_EXCEPTION COR_E_EXECUTIONENGINE COR_E_FIELDACCESS COR_E_FILENOTFOUND ou ERROR_FILE_NOT_FOUND COR_E_FORMAT COR_E_INDEXOUTOFRANGE COR_E_INVALIDCAST ou E_NOINTERFACE COR_E_INVALIDCOMOBJECT COR_E_INVALIDFILTERCRITERIA COR_E_INVALIDOLEVARIANTTYPE COR_E_INVALIDOPERATION COR_E_IO COR_E_MEMBERACCESS COR_E_METHODACCESS
Exceo .NET AppDomainUnloadedException ApplicationException ArgumentException ArgumentOutOfRangeException ArithmeticException ArrayTypeMismatchException BadImageFormatException COMEmulateException ContextMarshalException CoreException CryptographicException DirectoryNotFoundException DivideByZeroException DuplicateWaitObjectException EndOfStreamException EntryPointNotFoundException Exceo ExecutionEngineException FieldAccessException FileNotFoundException FormatException IndexOutOfRangeException InvalidCastException InvalidComObjectException InvalidFilterCriteriaException InvalidOleVariantTypeException InvalidOperationException IOException AccessException MethodAccessException
Visual C# Consolidado
676
COR_E_MISSINGFIELD COR_E_MISSINGMANIFESTRESOURCE COR_E_MISSINGMEMBER COR_E_MISSINGMETHOD COR_E_MULTICASTNOTSUPPORTED COR_E_NOTFINITENUMBER E_NOTIMPL COR_E_NOTSUPPORTED OrE_POINTER COR_E_NULLREFERENCE COR_E_OUTOFMEMORY ou E_OUTOFMEMORY COR_E_OVERFLOW COR_E_PATHTOOLONG ou ERROR_FILENAME_EXCED_RANGE COR_E_RANK COR_E_REFLECTIONTYPELOAD COR_E_REMOTING COR_E_SAFEARRAYTYPEMISMATCH COR_E_SECURITY COR_E_SERIALIZATION OrERROR_STACK_OVERFLOW COR_E_STACKOVERFLOW COR_E_SYNCHRONIZATIONLOCK COR_E_SYSTEM COR_E_TARGET COR_E_TARGETINVOCATION COR_E_TARGETPARAMCOUNT COR_E_THREADABORTED COR_E_THREADINTERRUPTED COR_E_THREADSTATE COR_E_THREADSTOP COR_E_TYPELOAD COR_E_TYPEINITIALIZATION COR_E_VERIFICATION COR_E_WEAKREFERENCE
MissingFieldException MissingManifestResourceException MissingMemberException MissingMethodException MulticastNotSupportedException NotFiniteNumberException NotImplementedException NotSupportedException NullReferenceException OutOfMemoryException OverflowException PathTooLongException RankException ReflectionTypeLoadException RemotingException SafeArrayTypeMismatchException SecurityException SerializationException StackOverflowException SynchronizationLockException SystemException TargetException TargetInvocationException TargetParameterCountException ThreadAbortException ThreadInterruptedException ThreadStateException ThreadStopException TypeLoadException TypeInitializationException VerificationException WeakReferenceException
Visual C# Consolidado
677
VTableCallsNotSupportedException COMException
Para recuperar informaes de erro estendidas, o cliente gerenciado deve examinar os campos do objeto de exceo que foi gerado. Para o objeto de exceo para fornecer informaes teis sobre um erro, o objeto COM deve implementa a IErrorInfo interface. Tempo de Execuo utiliza as informaes fornecidas por IErrorInfo para inicializar o objeto de exceo. Se o objeto COM no oferece suporte IErrorInfo, o Runtime Inicializa um objeto de exceo com valores padro. A tabela a seguir lista cada campo associado a um objeto de exceo e identifica a fonte de informaes padro quando o objeto com oferece suporte IErrorInfo. Observe que o Runtime s vezes ignorar uma HRESULT casos em onde h um IErrorInfo presente no segmento. Este comportamento pode ocorrer em casos onde. e HRESULT o IErrorInfo no representam o mesmo erro Campo Exceo ErrorCode HelpLink Fonte de informaes de com HRESULT retornado da chamada. Se IErrorInfo->HelpContext diferente de zero, a seqncia formada pelas concatenao IErrorInfo->GetHelpFile e " # ". e IErrorInfo>GetHelpContext Caso contrrio a seqncia retornada de IErrorInfo>GetHelpFile. Sempre uma referncia nula (Nothing no Visual Basic.) Seqncia de caracteres retornada de IErrorInfo->GetDescription. Seqncia de caracteres retornada de IErrorInfo->GetSource. O rastreamento da pilha. O nome do mtodo que retornados a falha HRESULT.
Campos exceo, como Message, Source a StackOverflowException., e StackTrace no esto disponveis para
2.
No prompt de comando, digite o seguinte comando para produzir MSIL para o conjunto:
ildasm New.dll /out:new.il
Visual C# Consolidado
678
3. 4.
Editar o MSIL conforme necessrio. No prompt de comando, digite o seguinte comando para produzir a sintaxe apropriada definindo um novo New.dll:
ilasm New.il /dll
Visual C# Consolidado
679
3. 4.
Voc pode usar um navegador de metadados, como para identificar eventos representantes. o Disassembler MSIL (Ildasm.exe), Consumir eventos da fonte de eventos COM da mesma maneira que consome eventos de uma origem de evento gerenciado.
Exemplo O exemplo a seguir demonstra como abrir uma janela do Internet Explorer e Wire eventos criados pelo InternetExplorer Objeto para manipuladores de eventos implementado no cdigo gerenciado. Definies de tipos Internet Explorer (incluindo representantes de evento) so importadas como metadados do SHDocVw.dll. O exemplo recpetores o TitleChange evento. C#
namespace InternetExplorer { using System; using System.Runtime.InteropServices; using SHDocVw; public class Explorer { public static void Main() { Explorer explorer = new Explorer(); explorer.Run(); } public void Run() { Object o = null; String s; try { // Starts the browser. m_IExplorer = new SHDocVw.InternetExplorer(); } catch(Exception e) { Console.WriteLine("Exception when creating Internet Explorer object {0}", e); return; } // Wires your event handlers to m_IExplorer. SetAllEvents(); try { // Goes to the home page. m_WebBrowser = (IWebBrowserApp) m_IExplorer; m_WebBrowser.Visible = true; m_WebBrowser.GoHome(); // Starts navigating to different URLs. Console.Write("Enter URL (or enter to quit): "); s = Console.ReadLine(); while (s != "" && m_IExplorer != null && m_WebBrowser != null) { m_WebBrowser.Navigate(s, ref o, ref o, ref o, ref o); Console.Write("Enter URL (or enter to quit): "); s = Console.ReadLine(); } m_WebBrowser.Quit(); } catch(Exception sE) { if (m_IExplorer == null && m_WebBrowser == null) { Console.WriteLine("Internet Explorer has gone away"); } else { Console.WriteLine("Exception happens {0}", sE); } } } // Uses the += syntax for adding delegates to events. void SetAllEvents() { if (m_IExplorer != null) { // Title Change event // DWebBrowserEvents2 is the name of the sink event //interface. // TitleChange is the name of the event. // DWebBrowserEvents2_TitleChangeEventHandler is the // delegate name assigned by TlbImp.exe. DWebBrowserEvents2_TitleChangeEventHandler DTitleChangeE = new DWebBrowserEvents2_TitleChangeEventHandler(OnTitleChange); m_IExplorer.TitleChange += DTitleChangeE; } } /////////////////////////////////////////////////////////////////////// // Define event handlers. // Document title changed static void OnTitleChange(String Text) { Console.WriteLine("Title changes to {0}", Text); } ////////////////////////////////////////////////////////////////////////// // The following are class fields. static private SHDocVw.InternetExplorer m_IExplorer = null; static private IWebBrowserApp m_WebBrowser = null; } }
Visual C# Consolidado
680
3.
Usar a biblioteca de tipos com exportado como uma base para declarar tipos gerenciados orientado com. Supondo que voc tiver um arquivo IDL ou arquivo biblioteca Tipo, decidir quais classes e interfaces voc deseja incluir no RCW personalizado. Voc pode excluir qualquer tipos que voc no pretende usar diretamente ou indiretamente em seu aplicativo. Criar um arquivo de origem em um idioma compatvel com CLS e declarar os tipos. Consulte Biblioteca tipo para resumo de converso assembly Para uma descrio completa do processo de converso de importao. Efetivamente, quando voc cria um RCW personalizado, voc est executando a atividade de converso fornecida pelo tipo manualmente o Importador da biblioteca Tipo (TLBIMP.exe). O Exemplo que segue este tipos mostra procedimento em um arquivo de biblioteca IDL ou tipo e seus tipos correspondentes no cdigo C#. Quando as declaraes estiverem concludas, compile o arquivo como voc compila qualquer outro cdigo de fonte gerenciado. Como com os tipos importados com TLBIMP.exe, algumas exigem informaes adicionais que voc pode adicionar diretamente a seu cdigo. Para obter detalhes, consulte Como editar conjuntos Interop:.
2.
3. 4.
Exemplo O cdigo a seguir mostra um exemplo da interface e ISATestSATest Classe em IDL e os tipos correspondentes no cdigo fonte C#. Arquivo de biblioteca IDL ou tipo
[ object, uuid(40A8C65D-2448-447A-B786-64682CBEF133), dual, helpstring("ISATest Interface"), pointer_default(unique) ] interface ISATest : IDispatch { [id(1), helpstring("method InSArray")] HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum); }; [ uuid(116CCA1E-7E39-4515-984990790DA6431E), helpstring("SATest Class") ] coclass SATest { [default] interface ISATest; };
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
2.
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 Usar Ferramenta de Definio de Esquema XML para Gerar Classes e Documentos de Esquema XML
A ferramenta definio de esquema XML (XSD.exe) permite que voc para gerar um esquema XML que descreve uma classe ou para gerar a classe definido por um esquema XML. Os procedimentos a seguir mostram como executar essas operaes. Para gerar classes que esto em conformidade com um esquema especfico 1. 2. Abra um prompt de comando. Passar o Esquema XML como um argumento para a ferramenta definio de esquema XML, que cria um conjunto de classes que precisamente correspondem ao Esquema XML, por exemplo:
xsd mySchema.xsd
A ferramenta s pode processar esquemas que fazem referncia a W3C (World Wide Web Consortium) XML Especificao de maro de 2001 16. Em outras palavras, o espao para nome Esquema XML deve estar " http://www.w3.org/2001/XMLSchema " que mostrado no exemplo a seguir.
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="" xmlns:xs="http://www.w3.org/2001/XMLSchema">
3.
Modificar as classes COM mtodos, propriedades, ou campos, conforme necessrio. Para obter mais informaes sobre como modificar uma classe com atributos, consulte Controlando a serializao XML usando atributos e Atributos que controlam serializao SOAP codificado.
Visual C# Consolidado
683
Geralmente til para examinar o esquema do no fluxo XML que gerado quando as instncias de uma classe (ou classes) so serializados. Por exemplo, voc pode publicar o esquema para outros usurios a ser usado, ou voc poder compar-lo a um esquema com o qual voc est tentando se atingir conformity.
O esquema (ou esquemas) sero gravadas, comeando com " a schema0.xsd " Nome.
Criar uma instncia da classe XmlElementAttribute. Definir para " BookID ". da ElementName a XmlElementAttribute Criar uma instncia da classe XmlAttributes. Adicione o XmlElementAttribute objeto para a coleo acessada atravs da XmlElements propriedade do XmlAttributes. Criar uma instncia da classe XmlAttributeOverrides. Adicionar para o XmlAttributeOverrides, passando o tipo de objeto para substituir e o nome do membro seja substitudo. o XmlAttributes Criar uma instncia da classe XmlSerializer com XmlAttributeOverrides. Cria uma instncia da classe Book, e serializado ou desserializar-lo.
Exemplo
Visual C# Consolidado
684
// Creates a StreamWriter to write the XML stream to. StreamWriter writer = new StreamWriter("Book.xml"); mySerializer.Serialize(writer, b); }
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); } } }
4.
Criar uma instncia de classe XmlSerializer, passando para o XmlSerializer Construtor. o XmlTypeMapping C#
XmlSerializer mySerializer = new XmlSerializer(myTypeMapping);
5. C#
Exemplo
// Serializes a class named Group as a SOAP message. XmlTypeMapping myTypeMapping = (new SoapReflectionImporter().ImportTypeMapping(typeof(Group)); XmlSerializer mySerializer = new XmlSerializer(myTypeMapping);
Visual C# Consolidado
686
Para resolver esses problemas, implementar a IXmlSerializable interface para controlar a serializao e a desserializao. Especificamente, implementar e ReadXml mtodos para chunk os dados. o WriteXml Para implementar reunir do lado do servidor 1. 2. 1. No computador servidor, o mtodo Web deve desativar o buffer ASP.NET e retornar um tipo que implementa IXmlSerializable. O tipo que implementa IXmlSerializable chunks os dados no mtodo WriteXml. Alterar o mtodo da Web em para retornar o tipo que implementa IXmlSerializable o proxy cliente. Voc pode usar fazer isso automaticamente, mas isso no mostrado aqui. para um SchemaImporterExtension Implementar o ReadXml mtodo para ler os dados em partes fluxo e gravar os bytes em disco. Essa implementao tambm aumenta eventos andamento que podem ser usados por um controle grfico, como uma barra de progresso.
2.
Exemplo O exemplo de cdigo a seguir mostra o mtodo web no cliente que desativa o buffer do ASP.NET. Ele tambm mostra a implementao do lado do cliente da interface IXmlSerializable que chunks os dados no mtodo WriteXml. C#
[WebMethod] [System.Web.Services.Protocols.SoapDocumentMethodAttribute (ParameterStyle= SoapParameterStyle.Bare)] public SongStream DownloadSong(DownloadAuthorization Authorization, string filePath) { // Turn off response buffering. System.Web.HttpContext.Current.Response.Buffer = false; // Return a song. SongStream song = new SongStream(filePath); return song; } ...[XmlSchemaProvider("MySchema")] public class SongStream : IXmlSerializable { private const string ns = "http://demos.Contoso.com/webservices"; private string filePath; public SongStream(){ } public SongStream(string filePath) { this.filePath = filePath; } // This is the method named by the XmlSchemaProviderAttribute applied to the type. public static XmlQualifiedName MySchema(XmlSchemaSet xs) { // This method is called by the framework to get the schema for this type. // We return an existing schema from disk. XmlSerializer schemaSerializer = new XmlSerializer(typeof(XmlSchema)); string xsdPath = null; // NOTE: replace the string with your own path. xsdPath = System.Web.HttpContext.Current.Server.MapPath("SongStream.xsd"); XmlSchema s = (XmlSchema)schemaSerializer.Deserialize( new XmlTextReader(xsdPath), null); xs.XmlResolver = new XmlUrlResolver(); xs.Add(s); return new XmlQualifiedName("songStream", ns); } void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) { // This is the chunking code. // ASP.NET buffering must be turned off for this to work. int bufferSize = 4096; char[] songBytes = new char[bufferSize]; FileStream inFile = File.Open(this.filePath, FileMode.Open, FileAccess.Read); long length = inFile.Length; // Write the file name. writer.WriteElementString("fileName", ns, Path.GetFileNameWithoutExtension(this.filePath)); // Write the size. writer.WriteElementString("size", ns, length.ToString()); // Write the song bytes. writer.WriteStartElement("song", ns); StreamReader sr = new StreamReader(inFile, true); int readLen = sr.Read(songBytes, 0, bufferSize); while (readLen > 0) { writer.WriteStartElement("chunk", ns); writer.WriteChars(songBytes, 0, readLen); writer.WriteEndElement(); writer.Flush(); readLen = sr.Read(songBytes, 0, bufferSize); } writer.WriteEndElement(); inFile.Close(); } System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { throw new System.NotImplementedException(); } void IXmlSerializable.ReadXml(System.Xml.XmlReader
Visual C# Consolidado
687
reader) { throw new System.NotImplementedException(); } } ...public class SongFile : IXmlSerializable { public static event ProgressMade OnProgress; public SongFile() { } private const string ns = "http://demos.teched2004.com/webservices"; public static string MusicPath; private string filePath; private double size; void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) { reader.ReadStartElement("DownloadSongResult", ns); ReadFileName(reader); ReadSongSize(reader); ReadAndSaveSong(reader); reader.ReadEndElement(); } void ReadFileName(XmlReader reader) { string fileName = reader.ReadElementString("fileName", ns); this.filePath = Path.Combine(MusicPath, Path.ChangeExtension(fileName, ".mp3")); } void ReadSongSize(XmlReader reader) { this.size = Convert.ToDouble(reader.ReadElementString("size", ns)); } void ReadAndSaveSong(XmlReader reader) { FileStream outFile = File.Open( this.filePath, FileMode.Create, FileAccess.Write); string songBase64; byte[] songBytes; reader.ReadStartElement("song", ns); double totalRead=0; while(true) { if (reader.IsStartElement("chunk", ns)) { songBase64 = reader.ReadElementString(); totalRead += songBase64.Length; songBytes = Convert.FromBase64String(songBase64); outFile.Write(songBytes, 0, songBytes.Length); outFile.Flush(); if (OnProgress != null) { OnProgress(100 * (totalRead / size)); } } else { break; } } outFile.Close(); reader.ReadEndElement(); } [PermissionSet(SecurityAction.Demand, Name="FullTrust")] public void Play() { System.Diagnostics.Process.Start(this.filePath); } System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { throw new System.NotImplementedException(); } public void WriteXml(XmlWriter writer) { throw new System.NotImplementedException(); } }
Compilando o cdigo
O cdigo usa espaos para nome a seguir: System., System.XmlSystem.Web.Services.Protocols, System.Web.ServicesSystem.Runtime.Serialization, System.Xml.Serialization e System.Xml.Schema
Visual C# Consolidado
688
write to a file, create a StreamWriter object. StreamWriter myWriter = new StreamWriter("myFileName.xml"); mySerializer.Serialize(myWriter, myObject); myWriter.Close();
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; }
4. 5. 6. 7. 8.
Exemplo O exemplo de cdigo a seguir serializes um arquivo em duas maneiras: primeiro, sem substituindo o comportamento a XmlSerializer classe, e em segundo lugar, por substituindo o comportamento. O exemplo contm uma classe denominada Group com vrios membros. Diversos atributos,, como o SoapElementAttribute, que foi. aplicado a membros de classe Quando a classe serializado com o SerializeOriginal mtodo, os atributos controlar o contedo da mensagem SOAP. Quando o SerializeOverride mtodo chamado, o comportamento do para esses atributos (conforme adequado). seja substitudo, criando vrios atributos e definio das propriedades da XmlSerializer uma SoapAttributes C#
using System; using System.IO; using System.Xml; using System.Xml.Serialization; using System.Xml.Schema; public class Group { [SoapAttribute (Namespace = "http://www.cpandl.com")] public string GroupName; [SoapAttribute(DataType = "base64Binary")] public Byte [] GroupNumber; [SoapAttribute(DataType = "date", AttributeName = "CreationDate")] public DateTime Today; [SoapElement(DataType = "nonNegativeInteger", ElementName = "PosInt")] public string PostitiveInt; // This is ignored when serialized unless it is overridden. [SoapIgnore] public bool IgnoreThis; public GroupType Grouptype; [SoapInclude(typeof(Car))] public Vehicle myCar(string licNumber) { Vehicle v; if(licNumber == "") { v = new Car(); v.licenseNumber = "!!!!!!"; } else { v = new Car(); v.licenseNumber = licNumber; } return v; } } public abstract class Vehicle { public string licenseNumber; public DateTime makeDate; } public class Car: Vehicle { } public enum GroupType { // These enums can be overridden. small,
Visual C# Consolidado
690
large } public class Run { public static void Main() { Run test = new Run(); test.SerializeOriginal("SoapOriginal.xml"); test.SerializeOverride("SoapOverrides.xml"); test.DeserializeOriginal("SoapOriginal.xml"); test.DeserializeOverride("SoapOverrides.xml"); } public void SerializeOriginal(string filename) { // Creates an instance of the XmlSerializer class. XmlTypeMapping myMapping = (new SoapReflectionImporter().ImportTypeMapping( typeof(Group))); XmlSerializer mySerializer = new XmlSerializer(myMapping); // Writing the file requires a TextWriter. TextWriter writer = new StreamWriter(filename); // Creates an instance of the class that will be serialized. Group myGroup = new Group(); // Sets the object properties. myGroup.GroupName = ".NET"; Byte [] hexByte = new Byte[2]{Convert.ToByte(100), Convert.ToByte(50)}; myGroup.GroupNumber = hexByte; DateTime myDate = new DateTime(2002,5,2); myGroup.Today = myDate; myGroup.PostitiveInt= "10000"; myGroup.IgnoreThis=true; myGroup.Grouptype= GroupType.small; Car thisCar =(Car) myGroup.myCar("1234566"); // Prints the license number just to prove the car was created. Console.WriteLine("License#: " + thisCar.licenseNumber + "\n"); // Serializes the class and closes the TextWriter. mySerializer.Serialize(writer, myGroup); writer.Close(); } public void SerializeOverride(string filename) { // Creates an instance of the XmlSerializer class // that overrides the serialization. XmlSerializer overRideSerializer = CreateOverrideSerializer(); // Writing the file requires a TextWriter. TextWriter writer = new StreamWriter(filename); // Creates an instance of the class that will be serialized. Group myGroup = new Group(); // Sets the object properties. myGroup.GroupName = ".NET"; Byte [] hexByte = new Byte[2]{Convert.ToByte(100), Convert.ToByte(50)}; myGroup.GroupNumber = hexByte; DateTime myDate = new DateTime(2002,5,2); myGroup.Today = myDate; myGroup.PostitiveInt= "10000"; myGroup.IgnoreThis=true; myGroup.Grouptype= GroupType.small; Car thisCar =(Car) myGroup.myCar("1234566"); // Serializes the class and closes the TextWriter. overRideSerializer.Serialize(writer, myGroup); writer.Close(); } public void DeserializeOriginal(string filename) { // Creates an instance of the XmlSerializer class. XmlTypeMapping myMapping = (new SoapReflectionImporter().ImportTypeMapping( typeof(Group))); XmlSerializer mySerializer = new XmlSerializer(myMapping); TextReader reader = new StreamReader(filename); // Deserializes and casts the object. Group myGroup; myGroup = (Group) mySerializer.Deserialize(reader); Console.WriteLine(myGroup.GroupName); Console.WriteLine(myGroup.GroupNumber[0]); Console.WriteLine(myGroup.GroupNumber[1]); Console.WriteLine(myGroup.Today); Console.WriteLine(myGroup.PostitiveInt); Console.WriteLine(myGroup.IgnoreThis); Console.WriteLine(); } public void DeserializeOverride(string filename) { // Creates an instance of the XmlSerializer class. XmlSerializer overRideSerializer = CreateOverrideSerializer(); // Reading the file requires a TextReader. TextReader reader = new StreamReader(filename); // Deserializes and casts the object. Group myGroup; myGroup = (Group) overRideSerializer.Deserialize(reader); Console.WriteLine(myGroup.GroupName); Console.WriteLine(myGroup.GroupNumber[0]); Console.WriteLine(myGroup.GroupNumber[1]); Console.WriteLine(myGroup.Today); Console.WriteLine(myGroup.PostitiveInt); Console.WriteLine(myGroup.IgnoreThis); } private XmlSerializer CreateOverrideSerializer() { SoapAttributeOverrides mySoapAttributeOverrides = new SoapAttributeOverrides(); SoapAttributes soapAtts = new SoapAttributes(); SoapElementAttribute mySoapElement = new SoapElementAttribute(); mySoapElement.ElementName = "xxxx"; soapAtts.SoapElement = mySoapElement; mySoapAttributeOverrides.Add(typeof(Group), "PostitiveInt", soapAtts); // Overrides the IgnoreThis property. SoapIgnoreAttribute myIgnore = new SoapIgnoreAttribute(); soapAtts = new SoapAttributes(); soapAtts.SoapIgnore = false; mySoapAttributeOverrides.Add(typeof(Group), "IgnoreThis", soapAtts); // Overrides the GroupType enumeration. soapAtts = new SoapAttributes(); SoapEnumAttribute xSoapEnum = new SoapEnumAttribute(); xSoapEnum.Name = "Over1000"; soapAtts.SoapEnum = xSoapEnum; // Adds the SoapAttributes to the // mySoapAttributeOverridesrides.
Visual C# Consolidado
691
mySoapAttributeOverrides.Add(typeof(GroupType), "large", soapAtts); // Creates a second enumeration and adds it. soapAtts = new SoapAttributes(); xSoapEnum = new SoapEnumAttribute(); xSoapEnum.Name = "ZeroTo1000"; soapAtts.SoapEnum = xSoapEnum; mySoapAttributeOverrides.Add(typeof(GroupType), "small", soapAtts); // Overrides the Group type. soapAtts = new SoapAttributes(); SoapTypeAttribute soapType = new SoapTypeAttribute(); soapType.TypeName = "Team"; soapAtts.SoapType = soapType; mySoapAttributeOverrides.Add(typeof(Group),soapAtts); // Creates an XmlTypeMapping that is used to create an instance // of the XmlSerializer class. Then returns the XmlSerializer. XmlTypeMapping myMapping = (new SoapReflectionImporter( mySoapAttributeOverrides)).ImportTypeMapping(typeof(Group)); XmlSerializer ser = new XmlSerializer(myMapping); return ser; } }
Visual C# Consolidado
692
Modificar as propriedades do objeto CultureAndRegionInfoBuilder para satisfazer os requisitos de seu aplicativo. Chame o Register mtodo para registrar a cultura personalizado. O processo de registro executa essas tarefas: Cria um arquivo.nlp que contm as informaes definido no objeto CultureAndRegionInfoBuilder. Armazena o arquivo.nlp no diretrio sistema %WINDIR%\Globalization em seu computador, que significa as informaes cultura persistir mesmo se ele estiver desativado em seu computador. Voc deve ter privilgios administrativos no computador onde a cultura personalizado est registrado porque o arquivo.nlp est armazenado em um diretrio do sistema. Prepara o .NET Framework para pesquisar o diretrio sistema %WINDIR%\Globalization em vez de um cache interno na prxima vez no h uma solicitao para criar o novo cultura personalizado. A cultura personalizado agora tem o mesmo status de qualquer predefinido cultura .NET Framework ou Windows localidade no seu computador. A cultura personalizado est disponvel at voc remover o arquivo.nlp correspondente do seu computador com o Unregister mtodo.
4.
Especificar o nome do seu cultura personalizado em um CultureInfo construtor de classe para criar uma instncia do que cultura personalizada em seu aplicativo.
Exemplo O exemplo de cdigo a seguir usa a CultureAndRegionInfoBuilder classe para definir e registrar uma cultura personalizado chamado " x trao US--, amostra " e ento cria um CultureInfo objeto para a cultura " x trao US--" amostras. O exemplo de cdigo tambm mostra algumas propriedades correspondentes do e CultureInfo Objetos. o CultureAndRegionInfoBuilder C#
// This example demonstrates the System.Globalization.Culture- // AndRegionInfoBuilder Register method. // Compile this code example with a reference to sysglobl.dll. using System; using System.Globalization; class Sample { public static void Main() { CultureAndRegionInfoBuilder cib = null; try { // Create a CultureAndRegionInfoBuilder object named "x-en-US-sample". Console.WriteLine("Create and explore the CultureAndRegionInfoBuilder...\n"); cib = new CultureAndRegionInfoBuilder( "x-en-US-sample", CultureAndRegionModifiers.None); // Populate the new CultureAndRegionInfoBuilder object with culture information. CultureInfo ci = new CultureInfo("en-US"); cib.LoadDataFromCultureInfo(ci); // Populate the new CultureAndRegionInfoBuilder object with region information. RegionInfo ri = new RegionInfo("US"); cib.LoadDataFromRegionInfo(ri); // Display some of the properties of the CultureAndRegionInfoBuilder object. Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName); Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName);
Visual C# Consolidado
693
Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName); Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId); Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric); Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol); Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName); Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName); Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName); Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName); Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName); Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName); Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName); Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName); Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName); Console.WriteLine(); // Register the custom culture. Console.WriteLine("Register the custom culture..."); cib.Register(); // Display some of the properties of the custom culture. Console.WriteLine("Create and explore the custom culture...\n"); ci = new CultureInfo("x-en-US-sample"); Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name); Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName); Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName); Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName); Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName); Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName); Console.WriteLine("\nNote:\n" + "Use the example in the Unregister method topic to remove the custom culture."); } catch (Exception e) { Console.WriteLine(e); } } } /* This code example produces the following results: Create and explore the CultureAndRegionInfoBuilder... CultureName:. . . . . . . . . . x-en-US-sample CultureEnglishName: . . . . . . English (United States) CultureNativeName:. . . . . . . English (United States) GeoId:. . . . . . . . . . . . . 244 IsMetric: . . . . . . . . . . . False ISOCurrencySymbol:. . . . . . . USD RegionEnglishName:. . . . . . . United States RegionName: . . . . . . . . . . x-en-US-sample RegionNativeName: . . . . . . . United States ThreeLetterISOLanguageName: . . eng ThreeLetterISORegionName: . . . USA ThreeLetterWindowsLanguageName: ENU ThreeLetterWindowsRegionName: . USA TwoLetterISOLanguageName: . . . en TwoLetterISORegionName: . . . . US Register the custom culture... Create and explore the custom culture... Name: . . . . . . . . . . . . . x-en-US-sample EnglishName:. . . . . . . . . . English (United States) NativeName: . . . . . . . . . . English (United States) TwoLetterISOLanguageName: . . . en ThreeLetterISOLanguageName: . . eng ThreeLetterWindowsLanguageName: ENU Note: Use the example in the Unregister method topic to remove the custom culture. */
Visual C# Consolidado
694
private delegate long SquareItInvoker(int input); private delegate TReturn OneParameter<TReturn, TParameter0> (TParameter0 p0);
2.
Criar uma matriz que especifica os tipos de parmetro para o mtodo dinmico. Neste exemplo, o nico parmetro est um int. (Integer), para que tenha apenas um elemento da matriz no Visual Basic C#
Type[] methodArgs = {typeof(int)};
3.
Criar um DynamicMethod. No exemplo do mtodo chamado SquareIt. Observao Ele no necessrio para dar nomes mtodos Dinmico, e eles no podem ser chamados pelo nome. Vrios mtodos dinmicos podem ter o mesmo nome. No entanto, o nome aparece em pilhas de chamada e pode ser til para depurao.
4.
O tipo do valor de retorno especificado como long. O mtodo est associado ao mdulo que contm a Example classe, que contm o cdigo de exemplo. Qualquer mdulo carregado pode ser especificado. O mtodo dinmico age como um mdulo - nvel static mtodo no Visual Basic). (Shared
C#
DynamicMethod squareIt = new DynamicMethod( "SquareIt", typeof(long), methodArgs, typeof(Example).Module);
5.
Emitir o corpo de mtodo. Neste exemplo, um ILGenerator objeto usado para emitir a linguagem intermediria Microsoft (MSIL). Como alternativa, um DynamicILInfo objeto pode ser usado em conjunto com geradores de cdigo no gerenciado para emitir o corpo de mtodo um DynamicMethod. O MSIL, neste exemplo carrega o argumento, que para um long, duplicatas. na pilha, converte-e multiplica os dois nmeros an int, o long, Isso deixa o resultado quadrado na pilha, e o mtodo tem a ver tudo retorno. C#
ILGenerator il = squareIt.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Conv_I8); il.Emit(OpCodes.Dup); il.Emit(OpCodes.Mul); il.Emit(OpCodes.Ret);
6.
Criar uma instncia do representante (declarado na etapa 1) que representa o mtodo dinmico chamando o CreateDelegate mtodo. Criar o representante conclui o mtodo, e qualquer tentativa adicional para alterar o mtodo por exemplo, adicionando mais MSIL so ignorados. O cdigo a seguir cria o representante e chama-lo, usando um representante genrico. C#
OneParameter<long, int> invokeSquareIt = (OneParameter<long, int>) squareIt.CreateDelegate(typeof(OneParameter<long, int>)); Console.WriteLine("123456789 squared = {0}", invokeSquareIt(123456789));
Para definir e executar um mtodo dinmico que esteja vinculado ao objeto 1. Declare um tipo delegate para executar o mtodo. Considere usar um representante genrico para minimizar o nmero de tipos de representante necessrias para declarar. O cdigo a seguir declara um tipo genrico de representante que pode ser usado para
Visual C# Consolidado
695
executar qualquer mtodo com um parmetro e um valor de retorno, ou um mtodo com dois parmetros e um valor de retorno se o representante estiver vinculado a um objeto. C#
private delegate TReturn OneParameter<TReturn, TParameter0> (TParameter0 p0);
2.
Criar uma matriz que especifica os tipos de parmetro para o mtodo dinmico. Se o representante que representa o mtodo deve ser vinculado a um objeto, o primeiro parmetro deve corresponder ao tipo o representante est vinculado. Neste exemplo, no so dois parmetros, do tipo Example e tipo int (Integer no Visual Basic.) C#
Type[] methodArgs2 = { typeof(Example), typeof(int) };
3.
Criar um DynamicMethod. No, neste exemplo o mtodo tem nome. O tipo do valor de retorno especificado como int (Integer no Visual Basic.) O mtodo tem acesso aos membros da classe Example privada e protegidos. C#
DynamicMethod multiplyHidden = new DynamicMethod( "", typeof(int), methodArgs2, typeof(Example));
4.
Emitir o corpo de mtodo. Neste exemplo, um ILGenerator objeto usado para emitir a linguagem intermediria Microsoft (MSIL). Como alternativa, um DynamicILInfo objeto pode ser usado em conjunto com geradores de cdigo no gerenciado para emitir o corpo de mtodo um DynamicMethod. O MSIL, neste exemplo carrega o primeiro argumento, que uma instncia da classe Example, e ele usa para carregar o valor de um campo particular da instncia do tipo int. O segundo argumento carregado e os dois nmeros so multiplicados. Se o resultado for maior do que int o valor ser truncado e os bits mais significativos sero descartados. O mtodo retorna, com o valor de retorno na pilha. C#
ILGenerator ilMH = multiplyHidden.GetILGenerator(); ilMH.Emit(OpCodes.Ldarg_0); FieldInfo testInfo = typeof(Example).GetField("test", BindingFlags.NonPublic | BindingFlags.Instance); ilMH.Emit(OpCodes.Ldfld, testInfo); ilMH.Emit(OpCodes.Ldarg_1); ilMH.Emit(OpCodes.Mul); ilMH.Emit(OpCodes.Ret);
5.
Criar uma instncia do representante (declarado na etapa 1) que representa o mtodo dinmico ao chamar a CreateDelegate sobrecarga mtodo. Criar o representante conclui o mtodo, e qualquer tentativa adicional para alterar o mtodo por exemplo, adicionando mais MSIL so ignorados. Observao Voc pode chamar o CreateDelegate mtodo vrias vezes para criar representantes vinculados a outras instncias do tipo de destino.
6.
O cdigo a seguir vincula o mtodo a uma nova instncia da classe Example cujo campo particular de teste definido para 42. Isto , sempre que o representante for chamado a instncia do Example passado para o primeiro parmetro do mtodo. O representante OneParameter usado porque o primeiro parmetro do mtodo sempre receber a instncia do Example. Quando o representante invocado, somente o parmetro segundo necessrio.
7.
C#
Visual C# Consolidado
696
OneParameter<int, int> invoke = (OneParameter<int, int>) multiplyHidden.CreateDelegate( typeof(OneParameter<int, int>), new Example(42) ); Console.WriteLine("3 * test = {0}", invoke(3));
Exemplo O exemplo de cdigo a seguir demonstra um mtodo dinmico simples e um mtodo dinmico vinculado a uma instncia de uma classe. O mtodo dinmico simples leva um argumento, um inteiro de 32 bits, e retorna o quadrado 64 bits do que inteiro. Um representante genrico usado para chamar o mtodo. O segundo mtodo dinmico tem dois parmetros, do tipo Example e tipo int (Integer no Visual Basic.) Quando o mtodo dinmico for criado, ela est vinculada a uma instncia do Example, usando um representante genrico que tem um argumento do tipo int. O representante no tem um argumento do tipo Example porque o primeiro parmetro do mtodo sempre receber a instncia do Example limite. Quando o representante invocado, somente o int argumento fornecido. Este mtodo dinmico acessa um campo particular da classe Example e retorna o produto do campo particular e o int argumento. O exemplo de cdigo define representantes podem ser usadas para executar os mtodos. C#
using System; using System.Reflection; using System.Reflection.Emit; public class Example { // The following constructor and private field are used to // demonstrate a method bound to an object. private int test; public Example(int test) { this.test = test; } // Declare delegates that can be used to execute the completed // SquareIt dynamic method. The OneParameter delegate can be // used to execute any method with one parameter and a return // value, or a method with two parameters and a return value // if the delegate is bound to an object. // private delegate long SquareItInvoker(int input); private delegate TReturn OneParameter<TReturn, TParameter0> (TParameter0 p0); public static void Main() { // Example 1: A simple dynamic method. // // Create an array that specifies the parameter types for the // dynamic method. In this example the only parameter is an // int, so the array has only one element. // Type[] methodArgs = {typeof(int)}; // Create a DynamicMethod. In this example the method is // named SquareIt. It is not necessary to give dynamic // methods names. They cannot be invoked by name, and two // dynamic methods can have the same name. However, the // name appears in calls stacks and can be useful for // debugging. // // In this example the return type of the dynamic method // is long. The method is associated with the module that // contains the Example class. Any loaded module could be // specified. The dynamic method is like a module-level // static method. // DynamicMethod squareIt = new DynamicMethod( "SquareIt", typeof(long), methodArgs, typeof(Example).Module); // Emit the method body. In this example ILGenerator is used // to emit the MSIL. DynamicMethod has an associated type // DynamicILInfo that can be used in conjunction with // unmanaged code generators. // // The MSIL loads the argument, which is an int, onto the // stack, converts the int to a long, duplicates the top // item on the stack, and multiplies the top two items on the // stack. This leaves the squared number on the stack, and // all the method has to do is return. // ILGenerator il = squareIt.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Conv_I8); il.Emit(OpCodes.Dup); il.Emit(OpCodes.Mul); il.Emit(OpCodes.Ret); // Create a delegate that represents the dynamic method. // Creating the delegate completes the method, and any further // attempts to change the method (for example, by adding more // MSIL) are ignored. The following code uses a generic // delegate that can produce delegate types matching any // single-parameter method that has a return type. // OneParameter<long, int> invokeSquareIt = (OneParameter<long, int>) squareIt.CreateDelegate(typeof(OneParameter<long, int>)); Console.WriteLine("123456789 squared = {0}",
Visual C# Consolidado
697
invokeSquareIt(123456789)); // Example 2: A dynamic method bound to an instance. // // Create an array that specifies the parameter types for a // dynamic method. If the delegate representing the method // is to be bound to an object, the first parameter must // match the type the delegate is bound to. In the following // code the bound instance is of the Example class. // Type[] methodArgs2 = { typeof(Example), typeof(int) }; // Create a DynamicMethod. In this example the method has no // name. The return type of the method is int. The method // has access to the protected and private data of the // Example class. // DynamicMethod multiplyHidden = new DynamicMethod( "", typeof(int), methodArgs2, typeof(Example)); // Emit the method body. In this example ILGenerator is used // to emit the MSIL. DynamicMethod has an associated type // DynamicILInfo that can be used in conjunction with // unmanaged code generators. // // The MSIL loads the first argument, which is an instance of // the Example class, and uses it to load the value of a // private instance field of type int. The second argument is // loaded, and the two numbers are multiplied. If the result // is larger than int, the value is truncated and the most // significant bits are discarded. The method returns, with // the return value on the stack. // ILGenerator ilMH = multiplyHidden.GetILGenerator(); ilMH.Emit(OpCodes.Ldarg_0); FieldInfo testInfo = typeof(Example).GetField("test", BindingFlags.NonPublic | BindingFlags.Instance); ilMH.Emit(OpCodes.Ldfld, testInfo); ilMH.Emit(OpCodes.Ldarg_1); ilMH.Emit(OpCodes.Mul); ilMH.Emit(OpCodes.Ret); // Create a delegate that represents the dynamic method. // Creating the delegate completes the method, and any further // attempts to change the method for example, by adding more // MSIL are ignored. // // The following code binds the method to a new instance // of the Example class whose private test field is set to 42. // That is, each time the delegate is invoked the instance of // Example is passed to the first parameter of the method. // // The delegate OneParameter is used, because the first // parameter of the method receives the instance of Example. // When the delegate is invoked, only the second parameter is // required. // OneParameter<int, int> invoke = (OneParameter<int, int>) multiplyHidden.CreateDelegate( typeof(OneParameter<int, int>), new Example(42) ); Console.WriteLine("3 * test = {0}", invoke(3)); } } /* This code example produces the following output: 123456789 squared = 15241578750190521 3 * test = 126 */
Compilando o cdigo
O cdigo contm as instrues C# using (Imports. no Visual Basic) necessrio para compilao H referncias do conjunto adicionais so necessrias. Compilar o cdigo na linha de comando usando csc.exe, vbc.exe, ou CL.exe. Para compilar o cdigo no Visual Studio, coloque-o em um modelo de projeto de aplicativo de console.
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
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.
2.
Construir uma matriz de argumentos Tipo para substituir para os parmetros tipo. A matriz deve conter o nmero correto de Type Objetos, na mesma ordem em que aparecem na lista de parmetros tipo. Neste caso, a chave (primeiro parmetro tipo) seja do tipo String, e os valores no dicionrio so instncias de uma classe denominada Example. C#
Type[] typeArgs = {typeof(string), typeof(Example)};
3.
Chame o MakeGenericType mtodo ao vincular os argumentos Tipo com os parmetros Tipo e construir o tipo.
Visual C# Consolidado
700
C#
Type constructed = d1.MakeGenericType(typeArgs);
4.
Use a CreateInstance sobrecarga mtodo para criar um objeto do tipo construdo. O cdigo a seguir armazena duas instncias da classe Example no objeto resultante Dictionary<String, Example>. C#
object o = Activator.CreateInstance(constructed);
Exemplo O exemplo de cdigo a seguir define um DisplayGenericType mtodo para examinar a definies tipo genrico e construdos tipos usados no cdigo e exibir suas informaes. Mostra como usar o DisplayGenericType mtodo a IsGenericType, IsGenericParameter., e GenericParameterPosition propriedades e o GetGenericArguments mtodo O exemplo tambm define um DisplayGenericParameter mtodo para examinar um parmetro tipo genrico e exibir suas restries. O exemplo de cdigo define um conjunto de tipos de teste, incluindo um tipo genrico que ilustra restries de parmetro, tipo e mostra como para exibir informaes sobre esses tipos. O exemplo constri um tipo a partir da Dictionary classe, criando uma matriz de argumentos Tipo e chamar o MakeGenericType mtodo. Compara o Type objeto construdo uso MakeGenericType com um Type objeto obtido usando typeof o programa (GetType. no Visual Basic), demonstrar que eles sejam os mesmos Da mesma forma, o programa usa o GetGenericTypeDefinition mtodo para obter a definio do tipo construdo, tipo genrico e compara-o para o Type objeto que representa a Dictionary classe. C#
using System; using System.Reflection; using System.Collections.Generic; using System.Security.Permissions; // Define an example interface. public interface ITestArgument {} // Define an example base class. public class TestBase {} // Define a generic class with one parameter. The parameter // has three constraints: It must inherit TestBase, it must // implement ITestArgument, and it must have a parameterless // constructor. public class Test<T> where T : TestBase, ITestArgument, new() {} // Define a class that meets the constraints on the type // parameter of class Test. public class TestArgument : TestBase, ITestArgument { public TestArgument() {} } public class Example { // The following method displays information about a generic // type. private static void DisplayGenericType(Type t) { Console.WriteLine("\r\n {0}", t); Console.WriteLine(" Is this a generic type? {0}", t.IsGenericType); Console.WriteLine(" Is this a generic type definition? {0}", t.IsGenericTypeDefinition); // Get the generic type parameters or type arguments. Type[] typeParameters = t.GetGenericArguments(); Console.WriteLine(" List {0} type arguments:", typeParameters.Length); foreach( Type tParam in typeParameters ) { if (tParam.IsGenericParameter) { DisplayGenericParameter(tParam); } else { Console.WriteLine(" Type argument: {0}", tParam); } } } // The following method displays information about a generic // type parameter. Generic type parameters are represented by // instances of System.Type, just like ordinary types. private static void DisplayGenericParameter(Type tp) { Console.WriteLine(" Type parameter: {0} position {1}", tp.Name, tp.GenericParameterPosition); Type classConstraint = null; foreach(Type iConstraint in tp.GetGenericParameterConstraints()) { if (iConstraint.IsInterface) { Console.WriteLine(" Interface constraint: {0}", iConstraint); } } if (classConstraint != null) { Console.WriteLine(" Base type constraint: {0}", tp.BaseType); } else Console.WriteLine(" Base type constraint: None"); GenericParameterAttributes
Visual C# Consolidado
701
sConstraints = tp.GenericParameterAttributes & GenericParameterAttributes.SpecialConstraintMask; if (sConstraints == GenericParameterAttributes.None) { Console.WriteLine(" No special constraints."); } else { if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.DefaultConstructorConstraint)) { Console.WriteLine(" Must have a parameterless constructor."); } if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.ReferenceTypeConstraint)) { Console.WriteLine(" Must be a reference type."); } if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.NotNullableValueTypeConstraint)) { Console.WriteLine(" Must be a nonnullable value type."); } } } [PermissionSetAttribute(SecurityAction.Demand, Name="FullTrust")] public static void Main() { // Two ways to get a Type object that represents the generic // type definition of the Dictionary class. // // Use the typeof operator to create the generic type // definition directly. To specify the generic type definition, // omit the type arguments but retain the comma that separates // them. Type d1 = typeof(Dictionary<,>); // You can also obtain the generic type definition from a // constructed class. In this case, the constructed class // is a dictionary of Example objects, with String keys. Dictionary<string, Example> d2 = new Dictionary<string, Example>(); // Get a Type object that represents the constructed type, // and from that get the generic type definition. The // variables d1 and d4 contain the same type. Type d3 = d2.GetType(); Type d4 = d3.GetGenericTypeDefinition(); // Display information for the generic type definition, and // for the constructed type Dictionary<String, Example>. DisplayGenericType(d1); DisplayGenericType(d2.GetType()); // Construct an array of type arguments to substitute for // the type parameters of the generic Dictionary class. // The array must contain the correct number of types, in // the same order that they appear in the type parameter // list of Dictionary. The key (first type parameter) // is of type string, and the type to be contained in the // dictionary is Example. Type[] typeArgs = {typeof(string), typeof(Example)}; // Construct the type Dictionary<String, Example>. Type constructed = d1.MakeGenericType(typeArgs); DisplayGenericType(constructed); object o = Activator.CreateInstance(constructed); Console.WriteLine("\r\nCompare types obtained by different methods:"); Console.WriteLine(" Are the constructed types equal? {0}", (d2.GetType()==constructed)); Console.WriteLine(" Are the generic definitions equal? {0}", (d1==constructed.GetGenericTypeDefinition())); // Demonstrate the DisplayGenericType and // DisplayGenericParameter methods with the Test class // defined above. This shows base, interface, and special // constraints. DisplayGenericType(typeof(Test<>)); } }
Compilando o cdigo
O cdigo contm as instrues C# using (Imports. no Visual Basic) necessrio para compilao H referncias do conjunto adicionais so necessrias. Compilar o cdigo na linha de comando usando csc.exe, vbc.exe, ou CL.exe. Para compilar o cdigo no Visual Studio, coloque-o em um modelo de projeto de aplicativo de console.
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.
9.
Definir o tipo de retorno para o mtodo, usando o SetReturnType mtodo. Neste exemplo, uma instncia do TOutput ser retornada. C#
factory.SetReturnType(TOutput);
10. Emitir o mtodo corpo, usando ILGenerator. Para obter detalhes, consulte o procedimento To Emit the Method Body de acompanhamento. Importante
Visual C# Consolidado
704
Quando voc emitir chamadas para mtodos de tipos genricos e os argumentos os tipo desses tipos so parmetros tipo do mtodo genrico, voc deve usar o static GetConstructor, GetMethod., e GetField overloads mtodo da classe TypeBuilder para obter formas dos mtodos construdo O procedimento de acompanhamento de emissor o corpo de mtodo demonstra isso. 11. Conclua o tipo que contm o mtodo e salvar o conjunto. O procedimento To Invoke the Generic Method acompanha mostra duas maneiras de chamar o mtodo concludo. C#
// Complete the type. Type dt = demoType.CreateType(); // Save the assembly, so it can be examined with Ildasm.exe. demoAssembly.Save(asmName.Name+".dll");
Para emitir o corpo de mtodo 1. Obter um gerador de cdigo e declarar variveis locais e rtulos. O DeclareLocal mtodo usado para declarar variveis locais. O Factory mtodo tem quatro variveis locais: retVal. Ele convertido em ICollection(Of TInput)), input para manter a matriz de entrada de TInput objetos, e index para percorrer a matriz para armazenar o novo TOutput que retornado pelo mtodo, ic para manter o TOutput quando em C# (ICollection<TInput> O mtodo tambm tem dois rtulos, uma para inserir o loop (enterLoop. (loopAgain), definio usando o DefineLabel mtodo) e outra para a parte superior do loop A primeira coisa o mtodo no para carregar seu argumento usando Ldarg_0 OpCode e para armazenar-na varivel input local usando Stloc_S OpCode. C#
ILGenerator ilgen = factory.GetILGenerator(); LocalBuilder retVal = ilgen.DeclareLocal(TOutput); LocalBuilder ic = ilgen.DeclareLocal(icollOfTInput); LocalBuilder input = ilgen.DeclareLocal(TInput.MakeArrayType()); LocalBuilder index = ilgen.DeclareLocal(typeof(int)); Label enterLoop = ilgen.DefineLabel(); Label loopAgain = ilgen.DefineLabel(); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Stloc_S, input);
2.
Emitir cdigo para criar uma instncia do TOutput, usando a sobrecarga mtodo genrico do mtodo System.Activator.CreateInstance. Usar essa sobrecarga requer o tipo especificado para que um construtor sem parmetros, que a razo para adicionar essa restrio para TOutput. Criar o mtodo genrico construdo, passagem TOutput para MakeGenericMethod. Aps emissor cdigo para chamar o mtodo, emitir cdigo para armazen-lo na varivel retVal usando Stloc_S o local C#
MethodInfo createInst = typeof(Activator).GetMethod("CreateInstance", Type.EmptyTypes); MethodInfo createInstOfTOutput = createInst.MakeGenericMethod(TOutput); ilgen.Emit(OpCodes.Call, createInstOfTOutput); ilgen.Emit(OpCodes.Stloc_S, retVal);
3.
Emitir cdigo para convertido para ICollection(Of TInput) o novo TOutput objeto e armazenlo na varivel ic local. C#
ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Box, icollOfTInput); ilgen.Emit(OpCodes.Castclass, icollOfTInput); ilgen.Emit(OpCodes.Stloc_S, ic);
4.
Obter um MethodInfo representando o System.Collections.Generic.ICollection.Add( mtodo. O mtodo est agindo em um ICollection(Of TInput). (ICollection<TInput>), portanto, ele necessrio para passar o Add mtodo especfico para esse tipo construdo em C# Voc no pode usar o GetMethod mtodo para obter isso MethodInfo diretamente do icollOfTInput, porque GetMethod no tem suporte em um tipo que tenha sido construdo
Visual C# Consolidado
705
com um GenericTypeParameterBuilder. Em vez disso, chame MethodInfo no icoll, que contm a definio tipo genrico para a ICollection interface genrico. Do MethodInfo usamos o GetMethod static mtodo para produzir para o tipo construdo. O cdigo a seguir demonstra isso. C#
MethodInfo mAddPrep = icoll.GetMethod("Add"); MethodInfo mAdd = TypeBuilder.GetMethod(icollOfTInput, mAddPrep);
5.
Emitir cdigo para inicializar a index varivel, ao carregar um inteiro de 32 bits 0 e armazen-lo na varivel. Emitir cdigo para filial para o rtulo enterLoop. Este rtulo ainda no tiver sido marcado, porque ele est dentro do loop. Cdigo para o loop emitted na prxima etapa. C#
// Initialize the count and enter the loop. ilgen.Emit(OpCodes.Ldc_I4_0); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.Emit(OpCodes.Br_S, enterLoop);
6.
Emitir cdigo para o loop. A primeira etapa para marcar a parte superior do loop, por chamada MarkLabel com o loopAgain rtulo. Agora instrues filial que usam o rtulo ser Branch a esse ponto no cdigo. A prxima etapa para empurrar o TOutput objeto, convertido em ICollection(Of TInput), na pilha. Ele no necessrio imediatamente, mas precisa fazer na posio para chamar o Add mtodo. Em seguida a matriz de entrada empurrada na pilha, em seguida, a index varivel que contm o ndice atual para a matriz. O Ldelem cdigo operao aparece o ndice e a matriz desativar a pilha e coloca o elemento matriz indexada na pilha. Agora a pilha est pronta para a chamada para o System.Collections.Generic.ICollection.Add( mtodo, que exibido coleo e o novo elemento desativar a pilha e adiciona o elemento para a coleo. O restante do cdigo no loop Incrementa o ndice e testa para ver se o loop For concludo:. O ndice e um inteiro de 32 bits so 1 pressionado na pilha e adicionado, deixando a soma na Pilha; a soma armazenada na index MarkLabel chamado para definir este ponto como o ponto de entrada para o loop. O ndice carregado novamente. A matriz de entrada pressionado na pilha, e Ldlen emitted para obter seu tamanho. O ndice e o comprimento so agora na pilha, e Clt emitted para compar-las. Se o ndice for menor que o comprimento, Brtrue_S ramificaes volta para o incio do loop. C#
ilgen.MarkLabel(loopAgain); ilgen.Emit(OpCodes.Ldloc_S, ic); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldelem, TInput); ilgen.Emit(OpCodes.Callvirt, mAdd); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldc_I4_1); ilgen.Emit(OpCodes.Add); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.MarkLabel(enterLoop); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldlen); ilgen.Emit(OpCodes.Conv_I4); ilgen.Emit(OpCodes.Clt); ilgen.Emit(OpCodes.Brtrue_S, loopAgain);
7.
Emitir cdigo para empurrar o TOutput objeto na Pilha e retornar do mtodo. As variveis retVal locais e ic ambos contiverem referncias ao novo TOutput; ic usada apenas para acessar o System.Collections.Generic.ICollection.Add( mtodo. C#
ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Ret);
Para chamar o mtodo genrico 1. Factory uma definio Mtodo genrico. A fim de cham-lo, voc deve atribuir tipos aos seus parmetros tipo genrico. Use o MakeGenericMethod mtodo para fazer isso. O
Visual C# Consolidado
706
cdigo a seguir cria um mtodo genrico construdo, especificando String para TInput e List(Of String). (List<string>) para TOutput, em C# e exibe uma representao de seqncia do mtodo C#
MethodInfo m = dt.GetMethod("Factory"); MethodInfo bound = m.MakeGenericMethod(typeof(string), typeof(List<string>)); // Display a string representing the bound method. Console.WriteLine(bound);
2.
Para chamar a vinculados as mtodo, use o Invoke mtodo. O cdigo a seguir cria uma matriz de Object, contendo uma matriz de seqncias de caracteres, como seu nico elemento e passa-como lista de argumentos do mtodo genrico. O primeiro parmetro do Invoke uma referncia nula porque o mtodo static. O valor de retorno convertido em List(Of String), e o primeiro elemento exibido. C#
object o = bound.Invoke(null, new object[]{arr}); List<string> list2 = (List<string>) o; Console.WriteLine("The first element is: {0}", list2[0]);
3.
Para chamar o mtodo usando um representante, voc deve ter um representante que corresponda a assinatura do mtodo genrico construdo Uma maneira fcil para fazer isso para criar um representante genrico. O cdigo a seguir cria uma instncia do representante D genrico definida no cdigo de exemplo, usando a System.Delegate.CreateDelegate(System.Type,System.Reflection.MethodInfo) sobrecarga mtodo, e chama o representante. Representantes executar melhor que vinculados as chamadas. C#
Type dType = typeof(D<string, List <string>>); D<string, List <string>> test; test = (D<string, List <string>>) Delegate.CreateDelegate(dType, bound); List<string> list3 = test(arr); Console.WriteLine("The first element is: {0}", list3[0]);
4.
O mtodo emitted tambm pode ser chamado de um programa que se refere ao conjunto salvo.
Exemplo O exemplo de cdigo a seguir cria um tipo nongeneric, DemoType,. com um mtodo genrico, Factory Este mtodo tem dois parmetros tipo genrico, TInput Para especificar um tipo de entrada e TOutput Para especificar um tipo de sada. O TOutput parmetro TYPE est restrita para implementar ICollection<TInput> (ICollection(Of TInput). no Visual Basic), para ser um tipo de referncia, e para que um construtor sem parmetros O mtodo tem um parmetro formal, que uma matriz de TInput. O mtodo retorna uma instncia TOutput que contm todos os elementos da matriz de entrada. Pode TOutput ser qualquer tipo a coleo genrica que implementa a ICollection interface genrico. Quando o cdigo executado, o conjunto dinmico salvo como DemoGenericMethod1.dll, e pode ser examinado usando o Disassembler MSIL (Ildasm.exe). Observao Uma boa maneira para aprender a emitir cdigo para gravar um programa que executa a tarefa voc est tentando se emitir, e use o Disassembler para examinar o MSIL produzido pelo compilador Visual Basic, C#, ou Visual C++.
Visual C# Consolidado
707
O exemplo de cdigo inclui cdigo de fonte que equivalente ao mtodo emitted. O mtodo emitted chamado vinculados as e tambm usando um representante genrico declarada no exemplo de cdigo. C#
using System; using System.Collections.Generic; using System.Reflection; using System.Reflection.Emit; // Declare a generic delegate that can be used to execute the // finished method. // public delegate TOut D<TIn, TOut>(TIn[] input); class GenericMethodBuilder { // This method shows how to declare, in Visual Basic, the generic // method this program emits. The method has two type parameters, // TInput and TOutput, the second of which must be a reference type // (class), must have a parameterless constructor (new()), and must // implement ICollection<TInput>. This interface constraint // ensures that ICollection<TInput>.Add can be used to add // elements to the TOutput object the method creates. The method // has one formal parameter, input, which is an array of TInput. // The elements of this array are copied to the new TOutput. // public static TOutput Factory<TInput, TOutput>(TInput[] tarray) where TOutput : class, ICollection<TInput>, new() { TOutput ret = new TOutput(); ICollection<TInput> ic = ret; foreach (TInput t in tarray) { ic.Add(t); } return ret; } public static void Main() { // The following shows the usage syntax of the C# // version of the generic method emitted by this program. // Note that the generic parameters must be specified // explicitly, because the compiler does not have enough // context to infer the type of TOutput. In this case, TOutput // is a generic List containing strings. // string[] arr = {"a", "b", "c", "d", "e"}; List<string> list1 = GenericMethodBuilder.Factory<string, List <string>>(arr); Console.WriteLine("The first element is: {0}", list1[0]); // Creating a dynamic assembly requires an AssemblyName // object, and the current application domain. // AssemblyName asmName = new AssemblyName("DemoMethodBuilder1"); AppDomain domain = AppDomain.CurrentDomain; AssemblyBuilder demoAssembly = domain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave); // Define the module that contains the code. For an // assembly with one module, the module name is the // assembly name plus a file extension. ModuleBuilder demoModule = demoAssembly.DefineDynamicModule(asmName.Name, asmName.Name+".dll"); // Define a type to contain the method. TypeBuilder demoType = demoModule.DefineType("DemoType", TypeAttributes.Public); // Define a public static method with standard calling // conventions. Do not specify the parameter types or the // return type, because type parameters will be used for // those types, and the type parameters have not been // defined yet. // MethodBuilder factory = demoType.DefineMethod("Factory", MethodAttributes.Public | MethodAttributes.Static); // Defining generic type parameters for the method makes it a // generic method. To make the code easier to read, each // type parameter is copied to a variable of the same name. // string[] typeParameterNames = {"TInput", "TOutput"}; GenericTypeParameterBuilder[] typeParameters = factory.DefineGenericParameters(typeParameterNames); GenericTypeParameterBuilder TInput = typeParameters[0]; GenericTypeParameterBuilder TOutput = typeParameters[1]; // Add special constraints. // The type parameter TOutput is constrained to be a reference // type, and to have a parameterless constructor. This ensures // that the Factory method can create the collection type. // TOutput.SetGenericParameterAttributes( GenericParameterAttributes.ReferenceTypeConstraint | GenericParameterAttributes.DefaultConstructorConstraint); // Add interface and base type constraints. // The type parameter TOutput is constrained to types that // implement the ICollection<T> interface, to ensure that // they have an Add method that can be used to add elements. // // To create the constraint, first use MakeGenericType to bind // the type parameter TInput to the ICollection<T> interface, // returning the type ICollection<TInput>, then pass // the newly created type to the SetInterfaceConstraints // method. The constraints must be passed as an array, even if // there is only one interface. // Type icoll =
Visual C# Consolidado
708
typeof(ICollection<>); Type icollOfTInput = icoll.MakeGenericType(TInput); Type[] constraints = {icollOfTInput}; TOutput.SetInterfaceConstraints(constraints); // Set parameter types for the method. The method takes // one parameter, an array of type TInput. Type[] parms = {TInput.MakeArrayType()}; factory.SetParameters(parms); // Set the return type for the method. The return type is // the generic type parameter TOutput. factory.SetReturnType(TOutput); // Generate a code body for the method. // ---------------------------------- // Get a code generator and declare local variables and // labels. Save the input array to a local variable. // ILGenerator ilgen = factory.GetILGenerator(); LocalBuilder retVal = ilgen.DeclareLocal(TOutput); LocalBuilder ic = ilgen.DeclareLocal(icollOfTInput); LocalBuilder input = ilgen.DeclareLocal(TInput.MakeArrayType()); LocalBuilder index = ilgen.DeclareLocal(typeof(int)); Label enterLoop = ilgen.DefineLabel(); Label loopAgain = ilgen.DefineLabel(); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Stloc_S, input); // Create an instance of TOutput, using the generic method // overload of the Activator.CreateInstance method. // Using this overload requires the specified type to have // a parameterless constructor, which is the reason for adding // that constraint to TOutput. Create the constructed generic // method by passing TOutput to MakeGenericMethod. After // emitting code to call the method, emit code to store the // new TOutput in a local variable. // MethodInfo createInst = typeof(Activator).GetMethod("CreateInstance", Type.EmptyTypes); MethodInfo createInstOfTOutput = createInst.MakeGenericMethod(TOutput); ilgen.Emit(OpCodes.Call, createInstOfTOutput); ilgen.Emit(OpCodes.Stloc_S, retVal); // Load the reference to the TOutput object, cast it to // ICollection<TInput>, and save it. // ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Box, icollOfTInput); ilgen.Emit(OpCodes.Castclass, icollOfTInput); ilgen.Emit(OpCodes.Stloc_S, ic); // Loop through the array, adding each element to the new // instance of TOutput. Note that in order to get a MethodInfo // for ICollection<TInput>.Add, it is necessary to first // get the Add method for the generic type defintion, // ICollection<T>.Add. This is because it is not possible // to call GetMethod on icollOfTInput. The static overload of // TypeBuilder.GetMethod produces the correct MethodInfo for // the constructed type. // MethodInfo mAddPrep = icoll.GetMethod("Add"); MethodInfo mAdd = TypeBuilder.GetMethod(icollOfTInput, mAddPrep); // Initialize the count and enter the loop. ilgen.Emit(OpCodes.Ldc_I4_0); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.Emit(OpCodes.Br_S, enterLoop); // Mark the beginning of the loop. Push the ICollection // reference on the stack, so it will be in position for the // call to Add. Then push the array and the index on the // stack, get the array element, and call Add (represented // by the MethodInfo mAdd) to add it to the collection. // // The other ten instructions just increment the index // and test for the end of the loop. Note the MarkLabel // method, which sets the point in the code where the // loop is entered. (See the earlier Br_S to enterLoop.) // ilgen.MarkLabel(loopAgain); ilgen.Emit(OpCodes.Ldloc_S, ic); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldelem, TInput); ilgen.Emit(OpCodes.Callvirt, mAdd); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldc_I4_1); ilgen.Emit(OpCodes.Add); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.MarkLabel(enterLoop); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldlen); ilgen.Emit(OpCodes.Conv_I4); ilgen.Emit(OpCodes.Clt); ilgen.Emit(OpCodes.Brtrue_S, loopAgain); ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Ret); // Complete the type. Type dt = demoType.CreateType(); // Save the assembly, so it can be examined with Ildasm.exe. demoAssembly.Save(asmName.Name+".dll"); // To create a constructed generic method that can be // executed, first call the GetMethod method on the completed // type to get the generic method definition. Call MakeGenericType // on the generic method definition to obtain the constructed // method, passing in the type arguments. In this case, the // constructed method has string for TInput and List<string> // for TOutput. // MethodInfo m = dt.GetMethod("Factory"); MethodInfo bound = m.MakeGenericMethod(typeof(string), typeof(List<string>)); // Display a string representing the bound method. Console.WriteLine(bound); // Once the generic method is constructed, // you can invoke it and pass
Visual C# Consolidado
709
in an array of objects // representing the arguments. In this case, there is only // one element in that array, the argument 'arr'. // object o = bound.Invoke(null, new object[]{arr}); List<string> list2 = (List<string>) o; Console.WriteLine("The first element is: {0}", list2[0]); // You can get better performance from multiple calls if // you bind the constructed method to a delegate. The // following code uses the generic delegate D defined // earlier. // Type dType = typeof(D<string, List <string>>); D<string, List <string>> test; test = (D<string, List <string>>) Delegate.CreateDelegate(dType, bound); List<string> list3 = test(arr); Console.WriteLine("The first element is: {0}", list3[0]); } } /* This code example produces the following output: The first element is: a System.Collections.Generic.List`1[System.String] Factory[String,List`1](System.String[]) The first element is: a The first element is: a */
Compilando o cdigo
O cdigo contm as instrues C# using (Imports. no Visual Basic) necessrio para compilao H referncias do conjunto adicionais so necessrias. Compilar o cdigo na linha de comando usando csc.exe, vbc.exe, ou CL.exe. Para compilar o cdigo no Visual Studio, coloque-o em um modelo de projeto de aplicativo de console.
Como Usar Assinatura Completa para Dar a um Assembly Dinmico um Nome Forte
Um conjunto dinmico pode ser fornecido um nome de alta segurana usando assinatura parcial ou completo assinatura. Do AssemblyName para assinatura parcial, a chave pblica deve ser especificada no passado para o DefineDynamicAssembly mtodo. O Common Language Runtime aloca o espao dentro do arquivo executvel (PE) porttil para um BLOB de assinatura nome de alta segurana, mas na verdade no no assinar o conjunto. O conjunto resultante pode totalmente entrar em uma etapa Post-Processing usando ferramentas fornecidas no SDK do .NET Framework. Para completo assinatura, um par de chaves pblica / particular deve ser fornecido. Essas entidades so normalmente armazenadas em um arquivo ou disco ou em um recipiente de chave Propriedade por uma API criptografia Cryptographic Provider (CSP) Service. Chaves de baixa segurana so geralmente gerado pelo CSPs baseados em software e exportado para um arquivo para que eles podem ser verificados em sistemas de gerenciamento de cdigo de fonte durante o desenvolvimento do projeto. Chaves de alta segurana geralmente so gerados por hardware que geralmente ajuda a evitar exportao das teclas para razes de segurana. Tais pares de chaves s podem ser acessados indiretamente por um recipiente de chave. O par de chaves nome de alta segurana especificado usando a System.Reflection.StrongNameKeyPair classe. O exemplo a seguir demonstra uso completo assinatura para dar um conjunto dinmico um nome de alta segurana. Exemplo C#
FileStream fs = new FileStream("SomeKeyPair.snk", FileMode.Open); StrongNameKeyPair kp = new StrongNameKeyPair(fs); fs.Close(); AssemblyName an = new AssemblyName(); an.KeyPair = kp; AppDomain appDomain = Thread.GetDomain(); AssemblyBuilder ab = appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
Visual C# Consolidado
710
O contexto de carga somente Reflection-permite-lhe examinar Conjuntos compilados a outras plataformas ou de outras verses do .NET Framework. Cdigo carregado neste contexto somente pode ser examinado; ele no pode ser executado. Isso significa que objetos no podem ser criados, porque os construtores no podem ser executadas. Porque o cdigo no pode ser executado, Dependncias no so carregadas automaticamente. Caso voc precise examin-los, voc deve carreg-los voc mesmo. Para carregar um conjunto no contexto de carga somente Reflection1. Use a ReflectionOnlyLoad sobrecarga mtodo para carregar o conjunto fornecido seu nome de exibio, ou o ReflectionOnlyLoadFrom mtodo para carregar o conjunto fornecido seu caminho. Se o conjunto for uma imagem binria, use a ReflectionOnlyLoad sobrecarga mtodo. Observao No use o contexto somente Reflection-para carregar uma verso de mscorlib.dll de uma verso do .NET Framework diferente da verso no contexto de execuo. 2. 3. 4. Se o conjunto possui dependncias, o ReflectionOnlyLoad mtodo no carregar-los. Caso voc precise examin-los, voc deve carreg-los voc mesmo,. Determinar se um conjunto carregado do contexto somente Reflection-usando propriedade do conjunto ReflectionOnly. Se atributos foram aplicados para o conjunto ou a tipos no conjunto, examine esses atributos, usando a CustomAttributeData classe para assegurar que nenhuma tentativa realizada para executar cdigo em um contexto somente Reflection-. Use a sobrecarga do System.Reflection.CustomAttributeData.GetCustomAttributes(System.Reflection.Assembly) mtodo apropriada para obter CustomAttributeData objetos que representam os atributos aplicados a um conjunto, membro, Mdulo, ou parmetro. Observao Atributos aplicados para o conjunto ou seu contedo para podem ser definidos no conjunto, ou que pode ser definida em outro conjunto carregado do contexto somente Reflection-. No possvel saber antecipadamente onde os atributos so definidos. Exemplo O exemplo de cdigo a seguir mostra como examinar os atributos aplicados a um conjunto carregado do contexto somente Reflection-. O exemplo de cdigo define um atributo com dois Construtores e uma propriedade personalizado. O atributo aplicado ao conjunto, para um tipo declarado no conjunto, para um mtodo do tipo, e para um parmetro do mtodo. Quando executado, o conjunto carrega prprio para o contexto somente Reflection-e exibe informaes sobre os atributos personalizados que foram aplicadas para ele e para os tipos e membros que ele contm. Observao Para simplificar exemplo de cdigo, o conjunto carrega e examina prprio. Normalmente, voc no deve esperar localizar o mesmo conjunto carregado no contexto de execuo e o contexto somente Reflection-.
Visual C# Consolidado
711
C#
using System; using System.Reflection; using System.Collections.Generic; // The example attribute is applied to the assembly. [assembly:Example(ExampleKind.ThirdKind, Note="This is a note on the assembly.")] // An enumeration used by the ExampleAttribute class. public enum ExampleKind { FirstKind, SecondKind, ThirdKind, FourthKind }; // An example attribute. The attribute can be applied to all // targets, from assemblies to parameters. // [AttributeUsage(AttributeTargets.All)] public class ExampleAttribute : Attribute { // Data for properties. private ExampleKind kindValue; private string noteValue; // Constructors. The parameterless constructor (.ctor) calls // the constructor that specifies ExampleKind, and supplies the // default value. // public ExampleAttribute(ExampleKind initKind) { kindValue = initKind; } public ExampleAttribute() : this(ExampleKind.FirstKind) {} // Properties. The Note property must be read/write, so that it // can be used as a named parameter. // public ExampleKind Kind { get { return kindValue; }} public string Note { get { return noteValue; } set { noteValue = value; } } } // The example attribute is applied to the test class. // [Example(ExampleKind.SecondKind, Note="This is a note on the class.")] public class Test { // The example attribute is applied to a method, using the // parameterless constructor and supplying a named argument. // The attribute is also applied to the method parameter. // [Example(Note="This is a note on a method.")] public void TestMethod([Example] object arg) { } // Main() gets objects representing the assembly, the test // type, the test method, and the method parameter. Custom // attribute data is displayed for each of these. // public static void Main() { Assembly asm = Assembly.ReflectionOnlyLoad("Source"); Type t = asm.GetType("Test"); MethodInfo m = t.GetMethod("TestMethod"); ParameterInfo[] p = m.GetParameters(); Console.WriteLine("\r\nAttributes for assembly: {0}", asm); ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm)); Console.WriteLine("\r\nAttributes for type: {0}", t); ShowAttributeData(CustomAttributeData.GetCustomAttributes(t)); Console.WriteLine("\r\nAttributes for member: {0}", m); ShowAttributeData(CustomAttributeData.GetCustomAttributes(m)); Console.WriteLine("\r\nAttributes for parameter: {0}", p); ShowAttributeData(CustomAttributeData.GetCustomAttributes(p[0])); } private static void ShowAttributeData( IList<CustomAttributeData> attributes) { foreach( CustomAttributeData cad in attributes ) { Console.WriteLine(" {0}", cad); Console.WriteLine(" Constructor: {0}", cad.Constructor); Console.WriteLine(" Constructor arguments:"); foreach( CustomAttributeTypedArgument cata in cad.ConstructorArguments ) { Console.WriteLine(" Type: {0} Value: {1}", cata.ArgumentType, cata.Value); } Console.WriteLine(" Named arguments:"); foreach( CustomAttributeNamedArgument cana in cad.NamedArguments ) { CustomAttributeTypedArgument cata = cana.TypedValue; Console.WriteLine(" MemberInfo: {0}", cana.MemberInfo); Console.WriteLine(" Type: {0} Value: {1}", cata.ArgumentType, cata.Value); } } } } /* This code example produces output similar to the following: Attributes for assembly: source, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null [ExampleAttribute((ExampleKind)2, Note = "This is a note on the assembly.")] Constructor: Void .ctor(ExampleKind) Constructor arguments: Type: ExampleKind Value: 2 Named arguments: MemberInfo: System.String Note Type: System.String Value: This is a note on the assembly. [System.Runtime.CompilerServices.CompilationRelaxationsAttribute((Int32)8)] Constructor: Void .ctor(Int32) Constructor arguments: Type: System.Int32 Value: 8 Named arguments: Attributes for type: Test [ExampleAttribute((ExampleKind)1, Note = "This is a note on the class.")] Constructor: Void .ctor(ExampleKind) Constructor arguments: Type: ExampleKind Value: 1 Named arguments: MemberInfo: System.String Note Type: System.String Value: This is a note on the class. Attributes for member: Void TestMethod(System.Object) [ExampleAttribute(Note = "This is a note on a method.")] Constructor: Void .ctor() Constructor arguments: Named arguments: MemberInfo: System.String
Visual C# Consolidado
712
Note Type: System.String Value: This is a note on a method. Attributes for parameter: System.Object arg [ExampleAttribute()] Constructor: Void .ctor() Constructor arguments: Named arguments: */
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.
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);
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
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
2.
Adicionar um construtor a esta classe que leva uma instncia do controle associado. Fornecer um campo particular para manter uma referncia a essa instncia. Tambm fornecer um campo particular para cache uma referncia DesignerActionService. Isso ser usado para atualizar a lista. C#
private ColorLabel colLabel;
C#
private DesignerActionUIService designerActionUISvc = null;
C#
public ColorLabelActionList( IComponent component ) : base(component) { this.colLabel = component as ColorLabel; // Cache a reference to DesignerActionUIService, so the // DesigneractionList can be refreshed. this.designerActionUISvc = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; }
3.
Adicionar mtodos e propriedades que voc deseja associar aos itens de marcas inteligentes. Mtodos sero executados quando sua entrada de marca inteligente correspondente selecionada. Propriedades devem ter sees Getter para que seu valor atual seja exibido; eles opcionalmente podem ter sees setter que use o GetProperties mtodo se seus valores tiverem que ser editvel da entrada de marca inteligente correspondente. Observao Como o caso em todo o ambiente Design-time, uma propriedade capaz de sendo editados somente se um dos tipos base fornecida pelo .NET Framework, o tipo pode ser convertido em um tipo base por um fornecido TypeConverter, ou quando um personalizado UITypeEditor fornecido.
C#
public Color ForeColor { get { return colLabel.ForeColor; } set { GetPropertyByName("ForeColor").SetValue(colLabel, value); } }
C#
// Boolean properties are automatically displayed with binary // UI (such as a checkbox). public bool LockColors { get { return colLabel.ColorLocked; } set { GetPropertyByName("ColorLocked").SetValue(colLabel, value); // Refresh the list. this.designerActionUISvc.Refresh(this.Component); } }
C#
public void InvertColors() { Color currentBackColor = colLabel.BackColor; BackColor = Color.FromArgb( 255 - currentBackColor.R, 255 - currentBackColor.G, 255 - currentBackColor.B); Color currentForeColor = colLabel.ForeColor; ForeColor = Color.FromArgb( 255 - currentForeColor.R, 255 - currentForeColor.G, 255 - currentForeColor.B); }
4.
Opcionalmente, implementar uma verso do GetSortedActionItems mtodo para retornar uma matriz de DesignerActionItem instncias, onde cada item est associado a uma propriedade ou mtodo criado na etapa anterior a substitudo. Faa isso para alterar a
Visual C# Consolidado
720
ordem dos itens, categoriz-los, ou opcionalmente mostr-las. A lista tambm pode incluir estticos itens, como ttulos grupo lgico. C#
public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new DesignerActionItemCollection(); //Define static section header entries. items.Add(new DesignerActionHeaderItem("Appearance")); items.Add(new DesignerActionHeaderItem("Information")); //Boolean property for locking color selections. items.Add(new DesignerActionPropertyItem("LockColors", "Lock Colors", "Appearance", "Locks the color properties.")); if (!LockColors) { items.Add(new DesignerActionPropertyItem("BackColor", "Back Color", "Appearance", "Selects the background color.")); items.Add(new DesignerActionPropertyItem("ForeColor", "Fore Color", "Appearance", "Selects the foreground color.")); //This next method item is also added to the context menu // (as a designer verb). items.Add(new DesignerActionMethodItem(this, "InvertColors", "Invert Colors", "Appearance", "Inverts the fore and background colors.", true)); } items.Add(new DesignerActionPropertyItem("Text", "Text String", "Appearance", "Sets the display text.")); //Create entries for static Information section. StringBuilder location = new StringBuilder("Location: "); location.Append(colLabel.Location); StringBuilder size = new StringBuilder("Size: "); size.Append(colLabel.Size); items.Add(new DesignerActionTextItem(location.ToString(), "Information")); items.Add(new DesignerActionTextItem(size.ToString(), "Information")); return items; }
Para atualizar a classe Designer associada para implementar a propriedade ActionLists 1. Localize a classe Designer para o controle. Se um no existir, crie uma classe designer e associ-la para a classe de controle. Para obter mais informaes sobre designers, consulte Base classes do criador. Como uma tcnica de otimizao, adicionar um campo particular do tipo DesignerActionListCollection. C#
private DesignerActionListCollection actionLists;
2.
3.
Adicionar a propriedade substituda ActionLists para retornar uma nova instncia da classe ColorLabelActionList que voc criou anteriormente. C#
public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new ColorLabelActionList(this.Component)); } return actionLists; } }
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.
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.
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.
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.
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.
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
3.
Tipo: Especifica o tipo da extenso SOAP e montagem ele reside em. Prioridade: especifica a prioridade relativa da extenso SOAP dentro de seu grupo. Grupo: Especifica o grupo uma extenso SOAP um membro da.
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" %>
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
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/>).
Aplicar um WebService atributo classe que implementar o servio da Web, a configurao da Namespace propriedade.
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.
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; } }
Visual C# Consolidado
727
Voc pode executar as aes a seguir para qualquer controle que oferea suporte modelos. Este exemplo usa o List controle. Para selecionar um filtro do dispositivo 1. 2. 3. Arraste o List controle de ou Panel controle em uma pgina mvel formulrios da Web ASP.NET. para a Toolbox uma Form Selecione o controle, e no menu de atalho, escolha Templating Options. A Templating Options caixa de dilogo ser exibida. Na lista Applied Device Filter drop-down, escolha o filtro do dispositivo que voc deseja configurar. Se voc desejar editar a associar modelos com este filtro, clique no Close boto e siga as etapas no Criando e editando modelos. Se o filtro que voc deseja usar no estiver na lista, clique no Edit boto para adicionar filtros para a lista de filtros do dispositivo aplicado. Isso abrir a Aplicado filtros do dispositivo caixa de dilogo. Se voc precisa para criar um novo filtro, clique no Edit boto. Na caixa Editor de filtro do dispositivo de dilogo, faa o seguinte: 1. 2. 3. 4. Clique no New Device Filter boto. Digite o nome para o novo filtro; por exemplo, SmallDevice. Defina a Tipo opo. Definir do filtro Atributos. Se voc estiver usando um filtro de comparao de igualdade, voc precisar especificar o atributo para comparar e o valor de comparao. Se o filtro for um filtro de representante avaliador, especifique seu tipo e mtodo. Do Up Arrow uso e Down Arrow Botes para definir a ordem na qual os filtros do dispositivo so salvos no arquivo de configurao (web.config) do aplicativo. Clique OK para salvar os filtros do dispositivo no arquivo de configurao do aplicativo e fechar a Device Filter Editor caixa de dilogo.
4.
5. 6. 5.
Use a Available Device Filters Lista suspensa para selecionar o filtro do dispositivo ou filtros que voc deseja usar. A Available Device Filters lista mostra todos os filtros do dispositivo definidos no nvel do aplicativo.
Visual C# Consolidado
728
6. 7.
Clique no Add to List boto. O filtro dispositivo selecionado agora parte da lista Applied Device Filters e pode ser usado para criar modelos. No campo Argument, opcionalmente, digite em um valor para o argumento a ser usado para o filtro de aplicado dispositivo selecionado. Para obter mais informaes, consulte Aplicar Filtros do dispositivo. Do Up Arrow uso e Down Arrow Botes para ordenar os filtros aplicados do dispositivo. Em tempo de execuo, os filtros so testados um por um da parte superior parte inferior. O primeiro filtro que resulta em uma avaliao xito do dispositivo determina quais modelos sero usados. Observao O filtro aplicado do dispositivo denominado (Default) sempre resulta em uma avaliao com xito. Se estiver presente, este filtro bloqueia todas as outras avaliaes abaixo na lista. Portanto, ela dever, logicamente aparecer como o ltimo filtro do dispositivo na lista Applied Device Filters drop-down. O (Default) filtro depois captura cada dispositivo que no corresponde a nenhum dos filtros acima na lista. Para obter mais informaes, consulte Introduo ao dispositivo filtros.
8.
9.
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.
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
Visual C# Consolidado
729
1.
Para este exemplo, selecione Edit Template no menu de atalho e depois escolha Header and Footer Templates. Do Header Template o List controle na sua formulrios da Web mveis pgina exibe e Footer Template caixas. Opcionalmente, digite texto literal para o cabealho na caixa Header Template, e para o rodap na caixa Footer Template . Como alternativa, voc pode arrastar controles de ou Footer Template caixas., como um Label controle, para o Toolbox, o Header Template Selecione Item TemplatesEdit Template no menu de atalho. O List controle na sua pgina de formulrios da Web mvel exibe o modelo item e o modelo AlternatingItem. Se voc editar o modelo AlternatingItem, por exemplo, pode definir plano de fundo de itens alternadas para ser uma cor diferente: 1. Voc pode arrastar um controle de e configure as propriedades de controle que. tal um Label controle, para o modelo item, o Toolbox, Por exemplo, voc pode definir a ForeColor propriedade com a cor que voc deseja para o item texto ou o primeiro. e cada indefinido item depois disso, se voc tambm definir um modelo AlternatingItem Voc pode arrastar um controle de e configure as propriedades de controle que. tal um Label controle, para o modelo AlternatingItem, o Toolbox, Por exemplo, voc pode definir a ForeColor propriedade com a cor que voc deseja para o texto do segundo item e cada item mesmo depois disso.
2.
3.
2.
4.
A partir do menu de atalho, selecione Edit Template, e escolha Separator Template. O List controle na sua pgina de formulrios da Web mvel exibe o modelo separador para edio. Adicione contedo ou um controle para o modelo separador seguindo um destes procedimentos: Type in a string of characters that you want to use for an item separator; for example, hyphens (----------). Arraste um Image controle para o modelo e especifique um arquivo grfico da Web a ser usado como o separador item. Vincular a um arquivo grfico do separador que voc deseja usar, utilizando a ImageUrl propriedade do controle Image. Quando voc tiver terminado, selecione End Template Editing no menu de atalho.
o o
5.
2.
Visual C# Consolidado
730
elementos ao descrio do servio para informar aos clientes que uma extenso SOAP deve executar, e o SDFE pode estender o proxy classe processo gerao para adicionar um atributo personalizado para a classe proxy, que faz com a classe para executar a extenso SOAP. Durante essa explicao passo a passo, voc aprender como: 1. 2. 3. 4. 5. Definir o XML para adicionar ao descrio do servio. Criar uma classe SDFE por derivar a partir da ServiceDescriptionFormatExtension classe. Escrever cdigo para estender o processo de gerao descrio do servio. Gravar cdigo para estender o proxy classe processo gerao. Configurar o SDFE para executar em tanto o cliente e servidor. Definir o XML e criar a classe SDFE Os exemplos de cdigo nessa explicao passo a passo envolver uma classe ServiceDescriptionFormateExtension YMLOperationBinding para uma classe SoapExtension YMLExtension. O cdigo completo aparece no tpico How to personalizar as descries do servio gerao e classes proxy (cdigo de exemplo).:
2.
Criar uma classe que deriva de ServiceDescriptionFormatExtension. Ao usar Visual Studio. NET, adicione uma referncia ao conjunto System.Web.Services . Tambm adicionar ou Imports instruo para espao para nome System.Web.Services.Description para o arquivo. um using O exemplo de cdigo a seguir cria a YMLOperationBinding classe, que deriva de ServiceDescriptionFormatExtension. C#
public class YMLOperationBinding : ServiceDescriptionFormatExtension
3.
Aplicar classe. um XmlFormatExtensionAttribute Este atributo especifica a etapa do processo de gerao descrio do servio, conhecido como um ponto de extenso, no qual o SDFE executa. A tabela a seguir lista os pontos de extenso definido e os elementos XML WSDL gerado durante cada ponto. Para o ponto de extenso especificado, o elemento WSDL correspondente ficar o pai do elemento sendo adicionado. Ponto de extenso Descrio
Visual C# Consolidado
731
ServiceDescription Corresponde ao elemento raiz definitions de um documento WSDL. Types Binding Corresponde ao elemento types delimitados pelo elemento raiz definitions. Corresponde ao elemento binding delimitados pelo elemento raiz definitions. Corresponde ao elemento operation delimitados pelo binding elemento. Corresponde ao elemento input delimitados pelo operation elemento. Corresponde ao elemento output delimitados pelo operation elemento. Corresponde ao elemento fault delimitados pelo operation elemento. Corresponde ao elemento port delimitados pelo service elemento. Corresponde ao elemento operation delimitados pelo portType elemento.
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.
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);
1.
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.
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>
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.
Visual C# Consolidado
736
1. 2. 3.
Abra um .NET Framework Prompt de comando SDK, e altere para o diretrio em que voc ir armazenar os ClickOnce arquivos. Crie uma subpasta chamada bin e coloque todos os seus arquivos do aplicativo Incluindo arquivos executveis, conjuntos, recursos, e arquivos de dados aqui, Crie uma subpasta chamada aps a verso atual do sua implantao. Se esta for a primeira vez voc estiver implantando o aplicativo, voc provavelmente escolher 1.0.0.0. Observao A verso da sua implantao pode estar distintas da verso dos arquivos do aplicativo.
4. 5.
Mover o diretrio \bin para a pasta que voc criou etapa 2. Gerar manifesto de aplicativo com uma chamada para Mage.exe:
mage -New Application -ToFile 1.0.0.0\WindowsFormsApp1.exe.manifest -Name "Windows Forms App 1" -Version 1.0.0.0 -FromDirectory 1.0.0.0\bin
6.
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.
9.
Copie todo dos arquivos na pasta atual incluindo a pasta de verso e a pasta \bin para o destino de implantao. Isso pode ser qualquer uma pasta em um site da Web ou FTP site, um compartilhamento de arquivo, ou um CD.
10. Fornecer os usurios com a URL, UNC ou mdia fsica necessria para instalar um aplicativo. Se voc est fornecendo um URL ou UNC, voc deve atribuir os usurios o caminho completo o manifesto de implantao. Por exemplo, caso WindowsFormsApp1 seja implantado para http://webserver01/ no diretrio WindowsFormsApp1, o caminho completo URL seria http://webserver01/WindowsFormsApp1/WindowsFormsApp1.Deploy. Implantando o aplicativo com a ferramenta Grfico MageUI.exe 1. 2. 3. Abra um .NET Framework Prompt de comando SDK, e navegue para a pasta em que voc ir armazenar os ClickOnce arquivos. Crie uma subpasta chamada bin e coloque todos os seus arquivos do aplicativo Incluindo arquivos executveis, conjuntos, recursos, e arquivos de dados aqui. Crie uma subpasta chamada aps a verso atual do sua implantao. Se esta for a primeira vez voc estiver implantando o aplicativo, voc provavelmente escolher 1.0.0.0.
Visual C# Consolidado
737
Observao A verso da sua implantao pode estar distintas da verso dos arquivos do aplicativo. 4. Mover o: \ bin diretrio para a pasta que voc criou na etapa 2, e inicie a ferramenta grfica
MageUI.exe
5. 6. 7. 8. 9.
Criar um novo manifesto de aplicativo, New selecionando File, Application Manifest. a partir do menu Na guia Padro Name, digite o nmero dessa Implantao nome e verso. Selecione a Files guia e clique no Browse... boto prximo caixa de texto Diretrio aplicativo. Selecione a pasta que contm os arquivos do aplicativo que voc criou na etapa 2, e clique OK na pasta Caixa de dilogo de seleo. Clique no Populate boto para adicionar todos os arquivos do aplicativo lista da arquivo. Se seu aplicativo contm mais de um arquivo executvel, marcar o arquivo executvel principal para essa implantao como o aplicativo de inicializao, selecionar Entry Point na lista File Type drop-down. MageUI.exe (se seu aplicativo s contm um arquivo executvel, ser marc-la para voc.)
10. Selecione a Permissions Required guia e selecione o nvel de confiana voc precisa seu aplicativo para declarar. O padro Full Trust, que ser adequado para a maioria dos aplicativos. 11. Selecione File, Save no menu, e salve o manifesto de aplicativo. Voc ser solicitado para assinar o manifesto de aplicativo quando voc salv-lo. 12. Se voc tiver um certificado armazenado como um arquivo no seu sistema de arquivos, use a Sign as certificate file opo, e selecione o certificado do sistema de arquivos usando o ... boto. OuSe o certificado mantido em um armazenamento de certificados acessvel de sua mquina, selecione e selecione o certificado na lista fornecida. o Sign with stored certificate option, 13. Selecionar File, New, Deployment Manifest no menu para criar sua implantao manifesto, e em seguida, na guia Name, fornea um nome e verso nmero, neste exemplo (1.0.0.0). 14. Selecione a Publisher guia e fornecer valores para Publisher e Product. ( Product is the name given your application on the Windows Start menu when you install your application locally.) 15. Alterne para a Update guia, e especifique a freqncia voc deseja este aplicativo para atualizar. Se o aplicativo usa a ClickOnce API de implantao para verificar se h atualizaes propriamente dito, desmarque a caixa de seleo rotulada This application should check for updates. 16. Alternar para a Application Reference guia. Voc pode preencher todos os valores nesta guia, clicando no Select Manifest boto e selecionando o aplicativo manifesto voc criou nas etapas anteriores. 17. Escolha Save e salvar o manifesto de implantao em disco. Voc ser solicitado para assinar o manifesto de aplicativo quando voc salv-lo.
Visual C# Consolidado
738
18. Se voc tiver um certificado armazenado como um arquivo no seu sistema de arquivos, use a Sign as certificate file opo, e selecione o certificado do sistema de arquivos usando o ... boto. OuSe o certificado mantido em um armazenamento de certificados acessvel de sua mquina, selecione e selecione o certificado na lista fornecida. o Sign with stored certificate option, 19. Copiar todos os arquivos na pasta atual, incluindo a pasta de verso e a pasta para o destino de implantao. \ bin Isso pode ser qualquer uma pasta em um site da Web ou FTP site, um compartilhamento de arquivo, ou um CD. 20. Fornecer os usurios com a URL, UNC ou mdia fsica necessria para instalar um aplicativo. Se voc est fornecendo um URL ou UNC, voc deve atribuir os usurios o caminho completo o manifesto de implantao. Por exemplo, caso WindowsFormsApp1 seja implantado para http://webserver01/ no diretrio WindowsFormsApp1, o caminho completo URL seria http://webserver01/WindowsFormsApp1/WindowsFormsApp1.Deploy. Prximas etapas Quando voc precisa implantar uma nova verso do aplicativo, precisar criar uma nova pasta chamada aps a nova verso por exemplo, 1.1.0.0and move the new application files into a \bin pasta em que novo diretrio. Voc deve gerar um novo manifesto de aplicativo e armazeneno novo diretrio, e ter o editor assinar o novo manifesto. Aps voc obter o manifesto assinado de volta, voc pode usar Mage.exe para atualizar o manifesto de implantao e aponte-lo no novo manifesto de aplicativo:
mage -Update WindowsFormsApp1.application -Version 1.1.0.0 -AppManifest 1.1.0.0\WindowsFormsApp1.exe.manifest
Usurios MageUI.exe podem efetuar a mesma operao, abrindo o seu manifesto de implantao, selecione a Application Reference guia e selecionar o Select Manifest boto novamente. Aps atualizar o aplicativo manifesto referncia, ser necessrio assinar novamente o manifesto de implantao, como alterar um manifesto de alguma forma invalida a assinatura digital.
Passo-a-passo: Fazendo o Download de Assemblies por Demanda com a API de Implantao do ClickOnce
Por padro, todos os as montagens includas um ClickOnce aplicativo so descarregados quando o aplicativo executado primeiro. Voc pode, entretanto, ter partes do seu aplicativo que so usados por um pequeno conjunto de seus usurios. Nesse caso, voc deseja baixar um conjunto somente quando voc cria um dos seus tipos. Explicao passo a passo o seguir demonstra como para marcar determinados conjuntos em seu aplicativo como " OPCIONAL ", e como baix-las usando classes no espao para nome System.Deployment.Application quando o Common Language Runtime (CLR) exige-los. Criar Projetos
Salvar o texto como um arquivo denominado ClickOnceOnDemand.cs ou ClickOnceOnDemand.vb, dependendo do idioma voc usar.
Visual C# Consolidado
739
2. 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. Salve o arquivo como um Form1.cs ou Form1.vb. csc /target:exe
/reference:ClickOnceOnDemand.dll Form1.csvbc /target:exe /reference:ClickOnceOnDemand.dll Form1.vb e compil-lo em um executvel
1.
Para marcar conjuntos como opcionais em seu aplicativo ClickOnce usando o manifesto gerao e ferramenta de edio-cliente grfico (MageUI.exe)
1. 2. 3. Crie seu ClickOnce manifestos conforme descrito em Passo-a-passo: Implantando um aplicativo ClickOnce manualmente. Nome seu aplicativo ClickOnceOnDemand. Antes de fechar MageUI.exe, selecione a guia contendo a implantao na manifesto de aplicativo, e selecione a Files guia dentro desse guia. Na guia Files Localizar OnDemandAssembly.dll na lista dos arquivos aplicativo e defina sua File Type Coluna a None. Para a Group coluna, digite ClickOnceOnDemand.dll. Teste o novo conjunto
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! "
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
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.
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.
2.
Visual C# Consolidado
742
is invoked by the Properties window. The UI is provided // by the LightShapeSelectionControl class. internal class LightShapeEditor : UITypeEditor {
Substituir o mtodo GetEditStyle O GetEditStyle mtodo indica para o ambiente de desenvolvimento que tipo de usurio interface a implementa Editor tipo UI. Os valores possveis so definidos no tipo UITypeEditorEditStyle. A LightShapeEditor implementa uma DropDown interface digite Editor.
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.
Substituir o mtodo PaintValue Voc pode fornecer uma representao grfica de valor sua propriedade por substituir o PaintValue mtodo.
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
No corpo da definio do seu controle, declare uma MarqueeLightShape propriedade chamada LightShape. Tambm declarar um campo da instncia chamado lightShapeValue do tipo MarqueeLightShape para fazer a propriedade. Do EditorAttribute Aplicar para a propriedade.
C#
private MarqueeLightShape lightShapeValue; [Category("Marquee")] [Browsable(true)] [EditorAttribute(typeof(LightShapeEditor), typeof(System.Drawing.Design.UITypeEditor))] public MarqueeLightShape LightShape { get { return this.lightShapeValue; } set { this.lightShapeValue = value; } }
Teste seu editor tipo UI Voc pode testar seu editor tipo UI, criando uma instncia do seu controle personalizado e anexlos a um PropertyGrid controle usando a SelectedObject propriedade. Se voc estiver usando Visual Studio, voc pode criar um novo projeto aplicativo do Windows, referncia conjunto o do controle, e adicionar uma instncia do seu controle para o formulrio. H suporte para esta tarefa em Visual Studio abrangente. Quando as propriedades de seu controle so exibidas no tempo de criao, voc pode selecionar a LightShape propriedade. Quando ele estiver selecionado, uma seta suspensa. aparece ( ) Quando voc clica na seta, o controle de exibio exibida sob a entrada Propriedade. Clique no crculo ou quadrado para selecionar o valor. Aps voc clicar em, o controle de exibio descarta propriamente dito, e o valor selecionado exibido no PropertyGrid. Observao Quando voc desenvolver seu personalizadas UITypeEditor, recomendvel que voc definir o nmero de criao para incrementar com cada compilao. Isso impede que verses mais antigas, armazenadas em cache de sendo criada no ambiente de desenvolvimento. seu UITypeEditor Prximas etapas Aps voc ter criado seu prprio Editor tipo UI, Explore outras maneiras para interagir com um PropertyGrid e o ambiente de criao:
Visual C# Consolidado
744
Gravar um editor tipo UI com base em uma caixa de dilogo restrita em vez de um controle de exibio. Escrever um conversor tipo for um tipo personalizado usando a TypeConverter classe. Para obter mais informaes, consulte COMO: Implementar um conversor de tipo. Gravar um designer de seu controle personalizado. Para obter mais informaes, consulte COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao.
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.
4. 5.
Implantar o aplicativo de componentes atendidos por registrar seu conjunto dinamicamente ou manualmente. Aps um componente de servio estiver registrado, os clientes podem criar instncias do componente como eles criar instncias de qualquer outro componente. Para obter um exemplo completo, consulte Exemplo de servio do componente. Observao Em plataformas Windows 2000, com + sempre carrega a verso mais recente do Common Language Runtime do para o componente voc est criando. Isso significa que em um
Visual C# Consolidado
745
computador com o .NET Framework verso 1.0 e .NET Framework verso 1.1 instalado,.NET Framework verso 1.1 carregado sempre. Como uma soluo, voc pode criar um arquivo Dllhost.exe.Configuration COM + que permite que voc para bloquear todos os aplicativos para uma verso especfica do .NET Framework. No Windows xp e plataformas Windows Server 2003, a configurao diretrio raiz de aplicativo pode ser usada para apontar com + para uma pasta apropriada para seu arquivo de configurao. Exemplo C#
using System.EnterpriseServices; [assembly: ApplicationName("Calculator")] [assembly: System.Reflection.AssemblyKeyFile("Calculator.snk")] [MustRunInClientContext] public class Calculator : ServicedComponent { public int Add (int x, int y) { return(x+y); } }
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() {} }
2. 3.
Substituir o Activate, Deactivate., e CanBePooled mtodos de classe System.EnterpriseServices.ServicedComponent Teste o objeto em pool, em um aplicativo do cliente: 1. Criar uma instncia da classe do objeto agrupada e chamar os mtodos no objeto em pool. Por exemplo, o cdigo a seguir cria uma instncia da classe TestObjectPooling e chama um Perform mtodo. C#
public class App { public static int Main(string[] args) { TestObjectPooling order = new TestObjectPooling(); order.Perform();
2. C#
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
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(); } }
Visual C# Consolidado
748
Como Usar o Recurso BYOT (Bring Your Own Transaction - Traga sua Prpria Transao) do COM+
Exemplo do cdigo O procedimento e exemplo a seguir mostram como uma classe derivada da classe ServicedComponent pode usar o recurso BYOT do COM + para acessar um coordenador transaes distribudas (DTC). Para obter mais informaes como utilizar o recurso BYOT de dentro do espao de nome System.EnterpriseServices, consulte BYOT (colocar seu prprio Transaction). Para criar um objeto que usa a transao de outro objeto. 1. Definir uma classe que deriva da classe ServicedComponent, e expe uma propriedade pblica que retorna o objeto transaes DTC com + atual. Por exemplo, no cdigo a seguir a classe Base, herda a classe ServicedComponent e tem uma propriedade pblica que retorna o objeto ContextUtil.Transaction para a transao COM + DTC atual no qual o objeto instanciado.
Visual C# Consolidado
749
C#
using System.EnterpriseServices; public class Base : ServicedComponent { public Object Transaction { get { return ContextUtil.Transaction; } } }
2.
Crie duas classes que derivar da classe definida na etapa 1 e defina o atributo de transaes para ambas as classes. Por exemplo, o cdigo a seguir declara duas classes CTransaction1 e CTransaction2 derivar de classe Base, e tm seu conjunto de atributos de transaes. C#
[Transaction] public class CTransaction1 : Base { // Insert your transaction logic here. } [Transaction] public class CTransaction2 : Base { // Insert your transaction logic here. }
3.
Criar um aplicativo do cliente que usa as classes criadas na etapa 2 para testar o recurso BYOT. 1. Criar uma instncia de uma das classes definidas na etapa 2. Por exemplo, o cdigo a seguir cria uma instncia da classe CTransaction1. C#
class BYOTDemonstration { static void Main() { CTransaction1 tx1 = new CTransaction1(); } }
2.
Recuperar a transao COM + DTC atual do objeto criado no 3.a etapa. Por exemplo, o cdigo a seguir recupera o objeto transaes a partir da propriedade Transaction pblica da classe CTransaction1. C#
Object tx = tx1.Transaction;
3.
Criar uma instncia da classe segundo definiu na etapa 2, usando o objeto Transaction recuperado em 3.b etapa. Por exemplo, o cdigo a seguir cria uma instncia da classe CTransaction2 usando o Transaction recuperada em 3.b etapa. C#
CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx, typeof(CTransaction2));
4. C#
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."); } }
Este exemplo mostra como usar o atributo PrivateComponentAttribute em uma classe. Exemplo C#
[PrivateComponent] public class CPrivate : ServicedComponent
Visual C# Consolidado
751
1.
Do TransactionAttribute derivar sua classe de classe ServicedComponent, e aplicar sua classe. O exemplo a seguir mostra como aplicar o atributo TransactionAttribute a uma classe derivada da classe ServicedComponent. C#
[Transaction(TransactionOption.Required)] public class Account : ServicedComponent { //. . . }
2.
Aplicar o atributo AutoCompletar para cada mtodo para o qual o mtodo ContextUtil.SetComplete deve ser chamado automaticamente na ausncia de excees. O exemplo a seguir mostra como aplicar o atributo AutoCompletar. C#
[AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. }
3.
Assinar o assembly com um strong name. Do AssemblyKeyFileAttribute para assinar o conjunto usando atributos, crie um par de chaves usando Sn.exe, e adicione ou AssemblyKeyNameAttribute Conjunto atributo e especifique o nome do arquivo que contm o par de chaves para assinar o conjunto com um nome de alta segurana. C#
[assembly: AssemblyKeyFileAttribute("TestApp.snk")]
4. 5.
Registrar o conjunto que contm a classe com o catlogo COM +. Se as instncias de chamada de sua classe do cliente gerenciado pelo Common Language Runtime, o registro ser executado para voc. No entanto, se voc prev que um chamador no gerenciado pode criar e chamar instncias da sua classe, usar a ferramenta de instalao dos Servios .NET (Regsvcs.exe) para executar o Registro manualmente.
Exemplo C#
// ----------------------------------------------------------------- // TestApp.cs // Generate a Strong name: // sn -k TestApp.snk // Compile the code: // csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs // Run TestApp: // start TestApp.exe // ----------------------------------------------------------------- using System; using System.Runtime.CompilerServices; using System.EnterpriseServices; using System.Reflection; //Registration details. //COM+ application name as it appears in the COM+ catalog. [assembly: ApplicationName("TestApp")] //Strong name for assembly. [assembly: AssemblyKeyFileAttribute("TestApp.snk")] [Transaction(TransactionOption.Required)] public class Account : ServicedComponent { //Provides SetComplete behavior in the absence of exceptions. [AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. } } public class client { public static int Main() { Account accountX = new Account(); accountX.Debit(100); return 0; } }
Compilando o cdigo
Visual C# Consolidado
752
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"); } } }
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.
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"); }
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.
4.
No aplicativo do cliente, criar uma instncia da classe do componente sem especificar uma seqncia de construo, para que o padro usado. Por exemplo, o cdigo a seguir cria uma instncia da classe TestObjectConstruct, e a seqncia de construo padro ser "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". C#
public class App { public static void Main() { TestObjectConstruct order = new TestObjectConstruct(); order. ConnectToDatabase(); } }
Depois de instalar o aplicativo Servios componente, voc pode especificar seqncias de construo por meio da ferramenta administrativa Servios de componente. Para inserir uma seqncia de construo de objeto para um componente, execute as seguintes etapas: 1. 2. 3. Abra a ferramenta administrativa Servios de componente. Clique com boto direito na ferramenta administrativa Servios de componente, mouse no componente que voc deseja configurar, e, em seguida, clique em Properties. Se voc no tenha definido o atributo ConstructionEnabled para True, na caixa Properties de dilogo, na guia Activation, marque a Enable object construction caixa de seleo para ativar o uso da seqncia de caracteres de construo do objeto. Se voc desejar alterar a seqncia de construo do padro especificado com o atributo ConstructionEnabled, na caixa Constructor string, insira a seqncia de construo.
4.
Exemplo
Visual C# Consolidado
756
C#
using System; using System.EnterpriseServices; using System.Data; using System.Data.SqlClient; [assembly : ApplicationName("OCDemo")] namespace OCDemo { [ConstructionEnabled(Default="Initial Catalog=Northwind; Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { private string connectStr; SqlConnection conn; public TestObjectConstruct() { } protected override void Construct(string constructString) { // Called after constructor. connectStr = constructString; } public void ConnectToDatabase() { conn = new SqlConnection(connectStr); conn.Open(); } } }
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.
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 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); }}
Use o Ferramenta Configurao estrutura .NET (Mscorcfg.msc). Exibir o diretrio do cache de conjunto de mdulos global. Use o Global ferramenta cache assembly (Gacutil.exe).
Procedimentos
Para exibir os nomes de conjuntos totalmente qualificados no cache de conjunto global usando a ferramenta .NET Framework Configuration
1. 2. Clique no Start boto, aponte para Administrative Tools, e clique em Microsoft .NET Framework Configuration Clique em Manage the Assembly Cache e, clique em View List of Assemblies in the Assembly Cache.
Para obter informaes sobre como usar a ferramenta Global Assembly Cache para exibir os nomes de conjuntos, totalmente qualificados Consulte Como Visualizar o Contedo da Cache Global de Assemblies. Do Disassembler MSIL (Ildasm.exe) para conjuntos de mdulos (assemblies) que no esto no cache de conjunto global, voc pode usar cdigo para exibir as informaes para o console ou a uma varivel, ou voc pode usar para examinar metadados do conjunto, que contm o nome totalmente qualificado. Para obter mais informaes sobre como definir atributos do conjunto, como verso, cultura e nome do conjunto, consulte Definir atributos Assembly. Para obter mais informaes sobre dar um conjunto um nome de alta segurana, consulte Criando e usando assemblies de nome forte. Exemplo
Visual C# Consolidado
759
O exemplo de cdigo a seguir mostra como exibir o nome totalmente qualificado de um conjunto que contm uma classe especificada para o console. C#
using System; using System.Reflection; class asmname { public static void Main() { Type t = typeof(System.Data.DataSet); string s = t.Assembly.FullName.ToString(); Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", s); } } Imports System Imports System.Reflection Imports Microsoft.VisualBasic ' For a class not contained in mscorlib.dll, compile this code with ' the /r:<dllname> option; for example,compile the code below using: ' vbc asmname.vb /r:System.Data.dll /r:System.dll /r:System.Xml.dll ' If the class is contained in mscorlib.dll, the /r:<dllname> compiler option is unnecessary. Class asmname Public Shared Sub Main() Dim t As Type = GetType(System.Data.DataSet) Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", t.Assembly.FullName.ToString()) End Sub 'Main End Class 'asmname
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
Exemplo O exemplo a seguir inicia com " Um Hello, bsico " World programa. Depois compilar o programa, use Ildasm.exe para desmontar o conjunto Hello.exe e exibir o manifesto do conjunto. Visual Basic
Imports System Public Module modmain Sub Main() Console.WriteLine ("Hello World using Visual Basic!") End Sub End Module using System; class MainApp { public static void Main() { Console.WriteLine("Hello World using C#!"); } } #using <mscorlib.dll> using namespace System; void main() { Console::WriteLine(L"Hello World using Managed Extensions!"); }
Executando o ildasm.exe Comando no conjunto Hello.exe e duas vezes no cone MANIFEST na janela DASM IL produz o seguinte resultado:
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 1:0:2411:0 } .assembly Hello { // --- The following custom attribute is added automatically; do not uncomment. ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool, // bool) = ( 01 00 00 01 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .module Hello.exe // MVID: {58AD9DFD-63A6462A-8AD5-42CBC95AA147} .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 // Image base: 0x03330000
A tabela a seguir descreve cada diretiva no conjunto do manifesto da montagem Hello.exe usado no exemplo. Diretiva .assembly extern <assembly name> Descrio Especifica outro conjunto que contm itens referenciados pelo mdulo atual (, neste exemplo, mscorlib).
.publickeytoken <token> Especifica o smbolo da chave real da montagem referenciada. .ver <version number> .assembly <assembly name> .hash algorithm <int32 value> .ver <version number> Especifica o nmero de verso da montagem referenciada. Especifica o nome do conjunto. Especifica o algoritmo hash usado. Especifica o nmero de verso do conjunto.
Visual C# Consolidado
761
Especifica o nome dos mdulos que compem o conjunto. Neste exemplo, o conjunto consiste em apenas um arquivo. Especifica o ambiente do aplicativo necessrio para o programa. Neste exemplo, o valor 3 indica que este executvel executado de um console. Atualmente um campo reservado nos metadados.
corflags
Um manifesto do conjunto pode conter um nmero de diretivas diferentes, dependendo do contedo do conjunto. Para obter uma lista abrangente das diretivas no manifesto do conjunto, consulte a documentao ECMA, especialmente " ii partio metadados: e semntica " definio e " partio III: CIL instruo Set ". A documentao est disponvel online em http://msdn.microsoft.com/net/ECMA/ e http://www.ECMAInternational.org/publications/Standards/ECMA-335.htm.
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
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:
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>
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."); } } }
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 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),
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)
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
2. 3.
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(); } }
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.
Do Vinculador do conjunto (AL.exe) voc pode usar para criar um conjunto de uma coleo de compilado mdulos de cdigo.
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.
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
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
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
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),
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.
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.
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
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
2.
Visual C# Consolidado
771
1.
ou AssemblyKeyFileAttributeAssemblyKeyNameAttribute, para especificar o nome do arquivo ou recipiente que contm o par de chaves para usar ao assinar o conjunto com um nome de alta segurana. GuidAttribute Para especificar o identificador de biblioteca (LIBID) da biblioteca de tipos de destino. PrimaryInteropAssemblyAttribute Para identificar o conjunto como um conjunto interoperacional primrio. Observao Voc tambm pode atrasar assinar um conjunto durante a compilao. Para obter mais informaes, consulte Atraso assinatura um conjunto.
2. 3.
3.
O exemplo de cdigo a seguir aplica chamado CompanyA.snk com um arquivo de chave e especifica que este conjunto de mdulos (assembly) um conjunto de interoperabilidade primrio suporte verses de biblioteca tipo 4.2 e 5.2. o AssemblyKeyFileAttribute Como mostra o exemplo, voc pode dispor mais de uma verso de uma biblioteca tipo Aplicando atributos adicionais conjunto-nvel.
C#
[assembly:AssemblyKeyFile(@"..\..\CompanyA.snk")] [assembly:Guid("97d25db0-0363-1cf-abc4-02608 c9e7553"] [assembly:PrimaryInteropAssembly(4, 2)] [assembly:PrimaryInteropAssembly(5, 2)]
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
Visual C# Consolidado
772
2. 3. 4. 5.
Exemplo O exemplo a seguir mostra um servidor gerenciado como a origem de eventos e um cliente COM como o coletor de eventos. O servidor gerenciado declara ButtonEvents como uma interface do coletor de eventos e se conecta a interface a Button classe. O cliente no gerenciado cria uma instncia da classe Button e implementa a interface do coletor de eventos. Visual Basic
' Managed server (event source) Option Explicit Option Strict Imports System Imports System.Runtime.InteropServices Namespace EventSource Public Delegate Sub ClickDelegate(x As Integer, y As Integer) Public Delegate Sub ResizeDelegate() Public Delegate Sub PulseDelegate() ' Step 1: Defines an event sink interface (ButtonEvents) to be ' implemented by the COM sink. <GuidAttribute("1A585C4D-337148dc-AF8A-AFFECC1B0967"), _ InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)> _ Public Interface ButtonEvents Sub Click(x As Integer, y As Integer) Sub Resize() Sub Pulse() End Interface ' Step 2: Connects the event sink interface to a class ' by passing the namespace and event sink interface ' ("EventSource.ButtonEvents, EventSrc"). <ComSourceInterfaces(GetType(ButtonEvents))> _ Public Class Button Public Event Click As ClickDelegate Public Event Resize As ResizeDelegate Public Event Pulse As PulseDelegate Public Sub CauseClickEvent(x As Integer, y As Integer) RaiseEvent Click(x, y) End Sub Public Sub CauseResizeEvent() RaiseEvent Resize() End Sub Public Sub CausePulse() RaiseEvent Pulse() End Sub End Class End Namespace using System; using System.Runtime.InteropServices; namespace EventSource { public delegate void ClickDelegate(int x, int y); public delegate void ResizeDelegate(); public delegate void PulseDelegate(); // Step 1: Defines an event sink interface (ButtonEvents) to be // implemented by the COM sink. [GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
Visual C# Consolidado
773
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface ButtonEvents { void Click(int x, int y); void Resize(); void Pulse(); } // Step 2: Connects the event sink interface to a class // by passing the namespace and event sink interface // ("EventSource.ButtonEvents, EventSrc"). [ComSourceInterfaces(GetType(ButtonEvents))] public class Button { public event ClickDelegate Click; public event ResizeDelegate Resize; public event PulseDelegate Pulse; public Button() { } public void CauseClickEvent(int x, int y) { Click(x, y); } public void CauseResizeEvent() { Resize(); } public void CausePulse() { Pulse(); } } } ' COM client (event sink) ' This Visual Basic 6.0 client creates an instance of the Button class and ' implements the event sink interface. The WithEvents directive ' registers the sink interface pointer with the source. Public WithEvents myButton As Button Private Sub Class_Initialize() Dim o As Object Set o = New Button Set myButton = o End Sub ' Events and methods are matched by name and signature. Private Sub myButton_Click(ByVal x As Long, ByVal y As Long) MsgBox "Click event" End Sub Private Sub myButton_Resize() MsgBox "Resize event" End Sub Private Sub myButton_Pulse() End Sub
o o
2. 3.
Aplicativos COM devem ter um manifesto de aplicativo estilo Win32-para identificar o componente gerenciado.
Visual C# Consolidado
774
Componentes baseado em .NET devem ter um manifesto componente para ativao informaes necessrias em tempo de execuo.
Este tpico descreve como associar um manifesto de aplicativo a um aplicativo; associar um manifesto componente a um componente; e incorporar um manifesto componente em um conjunto. Para criar um manifesto de aplicativo 1. 2. Usando um editor XML, criar (ou modificar) manifesto de aplicativo pertencentes ao aplicativo do COM que interoperar com um ou mais componentes gerenciados. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0">
Para informaes sobre elementos manifesto e seus atributos, procure por " Reference Manifests Application " na Biblioteca do MSDN. 3. Identificar o proprietrio do manifesto. No exemplo a seguir, myComApp Verso 1 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="myOrganization.myDivision.myComApp" version="1.0.0.0" processorArchitecture="x86" />
4.
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 ".
3.
Identificar o proprietrio do arquivo. O <assemblyIdentity> elemento do elemento <dependentAssembly> no arquivo de manifesto de aplicativo deve corresponder ao nome
Visual C# Consolidado
775
no manifesto do componente. No exemplo a seguir, myManagedComp Verso 1.2.3.4 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef"
4.
Identificar cada classe no conjunto. Use o <clrClass> elemento para identificar exclusivamente cada classe no conjunto de mdulos (assembly) gerenciado. O elemento, que um subelemento do elemento <assembly> tem dos atributos descritos na tabela a seguir. Atributo Clsid description name ProgID Descrio O identificador que especifica a classe para ser ativado. Seqncia que informe ao usurio sobre o componente. Uma seqncia vazia o padro. Uma seqncia de caracteres que representa a classe gerenciada. O identificador a ser usado para ativao vinculados as. Required Sim No Sim No No
runtimeVersion Este atributo ignorado. Se o Runtime no est carregado, a verso No mais recente ser carregada antes da classe ativado. Caso contrrio, a verso atualmente carregado usada. tlbid 5. O identificador da biblioteca de tipos que contm informaes sobre a classe tipo. No
Todas as marcas de atributo diferenciam maisculas de minsculas. Voc pode obter CLSIDs, ProgIDs, segmentao modelos, e a verso de tempo de execuo, exibindo a biblioteca de tipos exportada para o conjunto com o ObjectViewer OLE / com (Oleview.exe). O manifesto componente a seguir identifica uma classe nica com dois mtodos.
6.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoftcom:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef" <clrClass clsid="{65722BE6-3449-4628-ABD3-74B6864F9739}" progid="myManagedComp.testClass1" threadingModel="Both" name="myManagedComp.testClass1" runtimeVersion="v1.0.3705"> </clrClass> <clrClass clsid="{367221D6-3559-3328-ABD345B6825F9732}" progid="myManagedComp.testClass2" threadingModel="Both" name="myManagedComp.testClass2" runtimeVersion="v1.0.3705"> </clrClass> <file name="MyManagedComp.dll"> </file> </assembly>
7.
Salvar e nomear o arquivo de manifesto. O nome do componente um manifesto o nome da biblioteca do conjunto seguida pela extenso.manifest. Por exemplo, o myManagedComp.dll myManagedComp.manifest.
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
Uma pista que essa funo requer um retorno de chamada a presena do argumento lpEnumFunc. comum para ver o lp prefixo (ponteiro longo) combinado com o Func sufixo do nome do argumentos que se um ponteiro para uma funo de retorno de chamada. Para obter documentao sobre funes Win32, consulte Microsoft Platform SDK. 2. Crie a funo de retorno de chamada gerenciado. O exemplo declara um tipo delegate, que utiliza dois argumentos chamado CallBack, (hwnd e lparam.) O primeiro argumento um identificador para a janela; o segundo argumento definido pelo aplicativo. Nesta verso, ambos os argumentos devem ser inteiros. Funes de retorno de chamada geralmente retornam valores diferentes de zero para indicar xito e zero para indicar falha. Este exemplo explicitamente define o valor de retorno para true para continuar a enumerao. 3. Criar um representante e transfira-como um argumento para a EnumWindows funo. Chamar plataforma converte o representante em um formato de retorno de chamada familiarizado automaticamente. Verifique o coletor de lixo que no no recuperou o representante antes a funo de retorno de chamada conclua seu trabalho. Quando voc passar um representante como um parmetro, ou passar um representante contido como um campo em uma estrutura, ela permanece uncollected para a durao da chamada. Portanto, como o caso no seguinte exemplo de enumerao, a funo de retorno de chamada completa seu trabalho antes da chamada retorna e no requer nenhuma ao adicional pelo chamador gerenciado. Se, no entanto, a funo de retorno de chamada pode ser chamada depois retorna a chamada, o chamador gerenciado dever executar etapas para garantir que o representante permanece uncollected at terminar a funo de retorno de chamada. Para obter informaes detalhadas sobre como evitar coleta de lixo, consulte Interoperabilidade Marshaling COM Invoke Platform. Exemplo
4.
Visual C# Consolidado
777
C#
using System; using System.Runtime.InteropServices; public delegate bool CallBack(int hwnd, int lParam); public class EnumReportApp { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); public static void Main() { CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0); } public static bool Report(int hwnd, int lParam) { Console.Write("Window handle is "); Console.WriteLine(hwnd); return true; } }
Use o seguinte cdigo para criar uma nova classe de exceo chamado NoAccessException e mape-lo para o HRESULT E_ACCESSDENIED. C++
Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }
Voc pode encontrar um programa (em qualquer linguagem de programao) que usa um cdigo tanto gerenciados e no gerenciados ao mesmo tempo. Por exemplo, o empacotador personalizado no exemplo de cdigo a seguir usa o Marshal.ThrowExceptionForHR(int HResult) mtodo para acionar uma exceo com um valor HRESULT especfico. O mtodo procura o HRESULT e gera o tipo de exceo apropriado. Por exemplo, o HRESULT no fragmento de cdigo a seguir gera ArgumentException. C++
CMyClass::MethodThatThrows { Marshal.ThrowExceptionForHR(COR_E_ARGUMENT); }
A tabela a seguir fornece o mapeamento completo de cada HRESULT sua classe de exceo comparvel no .NET Framework. HRESULT Exceo .NET
Visual C# Consolidado
778
MSEE_E_APPDOMAINUNLOADED COR_E_APPLICATION COR_E_ARGUMENT ou E_INVALIDARG COR_E_ARGUMENTOUTOFRANGE COR_E_ARITHMETIC ou ERROR_ARITHMETIC_OVERFLOW COR_E_ARRAYTYPEMISMATCH COR_E_BADIMAGEFORMAT ou ERROR_BAD_FORMAT COR_E_COMEMULATE_ERROR COR_E_CONTEXTMARSHAL COR_E_CORE NTE_FAIL COR_E_DIRECTORYNOTFOUND ou ERROR_PATH_NOT_FOUND COR_E_DIVIDEBYZERO COR_E_DUPLICATEWAITOBJECT COR_E_ENDOFSTREAM COR_E_TYPELOAD COR_E_EXCEPTION COR_E_EXECUTIONENGINE COR_E_FIELDACCESS COR_E_FILENOTFOUND ou ERROR_FILE_NOT_FOUND COR_E_FORMAT COR_E_INDEXOUTOFRANGE COR_E_INVALIDCAST ou E_NOINTERFACE COR_E_INVALIDCOMOBJECT COR_E_INVALIDFILTERCRITERIA COR_E_INVALIDOLEVARIANTTYPE COR_E_INVALIDOPERATION COR_E_IO COR_E_MEMBERACCESS COR_E_METHODACCESS COR_E_MISSINGFIELD COR_E_MISSINGMANIFESTRESOURCE COR_E_MISSINGMEMBER
AppDomainUnloadedException ApplicationException ArgumentException ArgumentOutOfRangeException ArithmeticException ArrayTypeMismatchException BadImageFormatException COMEmulateException ContextMarshalException CoreException CryptographicException DirectoryNotFoundException DivideByZeroException DuplicateWaitObjectException EndOfStreamException EntryPointNotFoundException Exceo ExecutionEngineException FieldAccessException FileNotFoundException FormatException IndexOutOfRangeException InvalidCastException InvalidComObjectException InvalidFilterCriteriaException InvalidOleVariantTypeException InvalidOperationException IOException AccessException MethodAccessException MissingFieldException MissingManifestResourceException MissingMemberException
Visual C# Consolidado
779
COR_E_MISSINGMETHOD COR_E_MULTICASTNOTSUPPORTED COR_E_NOTFINITENUMBER E_NOTIMPL COR_E_NOTSUPPORTED OrE_POINTER COR_E_NULLREFERENCE COR_E_OUTOFMEMORY ou E_OUTOFMEMORY COR_E_OVERFLOW COR_E_PATHTOOLONG ou ERROR_FILENAME_EXCED_RANGE COR_E_RANK COR_E_REFLECTIONTYPELOAD COR_E_REMOTING COR_E_SAFEARRAYTYPEMISMATCH COR_E_SECURITY COR_E_SERIALIZATION OrERROR_STACK_OVERFLOW COR_E_STACKOVERFLOW COR_E_SYNCHRONIZATIONLOCK COR_E_SYSTEM COR_E_TARGET COR_E_TARGETINVOCATION COR_E_TARGETPARAMCOUNT COR_E_THREADABORTED COR_E_THREADINTERRUPTED COR_E_THREADSTATE COR_E_THREADSTOP COR_E_TYPELOAD COR_E_TYPEINITIALIZATION COR_E_VERIFICATION COR_E_WEAKREFERENCE COR_E_VTABLECALLSNOTSUPPORTED Todos os outros HRESULTs
MissingMethodException MulticastNotSupportedException NotFiniteNumberException NotImplementedException NotSupportedException NullReferenceException OutOfMemoryException OverflowException PathTooLongException RankException ReflectionTypeLoadException RemotingException SafeArrayTypeMismatchException SecurityException SerializationException StackOverflowException SynchronizationLockException SystemException TargetException TargetInvocationException TargetParameterCountException ThreadAbortException ThreadInterruptedException ThreadStateException ThreadStopException TypeLoadException TypeInitializationException VerificationException WeakReferenceException VTableCallsNotSupportedException COMException
Para recuperar informaes de erro estendidas, o cliente gerenciado deve examinar os campos do objeto de exceo que foi gerado. Para o objeto de exceo para fornecer informaes teis
Visual C# Consolidado
780
sobre um erro, o objeto COM deve implementa a IErrorInfo interface. Tempo de Execuo utiliza as informaes fornecidas por IErrorInfo para inicializar o objeto de exceo. Se o objeto COM no oferece suporte IErrorInfo, o Runtime Inicializa um objeto de exceo com valores padro. A tabela a seguir lista cada campo associado a um objeto de exceo e identifica a fonte de informaes padro quando o objeto com oferece suporte IErrorInfo. Observe que o Runtime s vezes ignorar uma HRESULT casos em onde h um IErrorInfo presente no segmento. Este comportamento pode ocorrer em casos onde. e HRESULT o IErrorInfo no representam o mesmo erro Campo Exceo ErrorCode HelpLink Fonte de informaes de com HRESULT retornado da chamada. Se IErrorInfo->HelpContext diferente de zero, a seqncia formada pelas concatenao IErrorInfo->GetHelpFile e " # ". e IErrorInfo>GetHelpContext Caso contrrio a seqncia retornada de IErrorInfo>GetHelpFile. Sempre uma referncia nula (Nothing no Visual Basic.) Seqncia de caracteres retornada de IErrorInfo->GetDescription. Seqncia de caracteres retornada de IErrorInfo->GetSource. O rastreamento da pilha. O nome do mtodo que retornados a falha HRESULT.
Campos exceo, como Message, Source a StackOverflowException., e StackTrace no esto disponveis para
2.
No prompt de comando, digite o seguinte comando para produzir MSIL para o conjunto:
ildasm New.dll /out:new.il
3. 4.
Editar o MSIL conforme necessrio. No prompt de comando, digite o seguinte comando para produzir a sintaxe apropriada definindo um novo New.dll:
ilasm New.il /dll
Visual C# Consolidado
781
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; } }
Visual C# Consolidado
783
2.
Criar um arquivo de origem em um idioma compatvel com CLS e declarar os tipos. Consulte Biblioteca tipo para resumo de converso assembly Para uma descrio completa do processo de converso de importao. Efetivamente, quando voc cria um RCW personalizado, voc est executando a atividade de converso fornecida pelo tipo manualmente o Importador da biblioteca Tipo (TLBIMP.exe). O Exemplo que segue este tipos mostra procedimento em um arquivo de biblioteca IDL ou tipo e seus tipos correspondentes no cdigo C#. Quando as declaraes estiverem concludas, compile o arquivo como voc compila qualquer outro cdigo de fonte gerenciado. Como com os tipos importados com TLBIMP.exe, algumas exigem informaes adicionais que voc pode adicionar diretamente a seu cdigo. Para obter detalhes, consulte Como editar conjuntos Interop:.
3. 4.
Exemplo O cdigo a seguir mostra um exemplo da interface e ISATestSATest Classe em IDL e os tipos correspondentes no cdigo fonte C#. Arquivo de biblioteca IDL ou tipo
[ object, uuid(40A8C65D-2448-447A-B786-64682CBEF133), dual, helpstring("ISATest Interface"), pointer_default(unique) ] interface ISATest : IDispatch { [id(1), helpstring("method InSArray")] HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum); }; [ uuid(116CCA1E-7E39-4515-984990790DA6431E), helpstring("SATest Class") ] coclass SATest { [default] interface ISATest; };
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
2.
3.
Usando um editor de texto, insira um atributo segundo PrimaryInteropAssemblyAttribute abaixo o atributo adicionado por TLBIMP.exe. Incluir os nmeros de verso primria e secundria que representam a segunda verso de biblioteca tipo. Gerar e assinar um novo conjunto do arquivo de texto modificado por meio do Assembler MSIL (Ilasm.exe):
ilasm LibUtil.il /dll /key:CompanyA.snk
4.
Visual C# Consolidado
785
5.
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.
Visual C# Consolidado
786
1. 2. 3.
Selecione o controle ao qual voc quer se conectar um manipulador de eventos. Na janela Propriedades, clique no Events boto ( ).
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.
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();
Visual C# Consolidado
788
Adicione o controle que ser exibida a dica de ferramenta. Use o SetToolTip mtodo do componente ToolTip.
Para definir uma dica de ferramenta no designer 1. 2. Adicionar um ToolTip componente para o formulrio. Selecione o controle que exibir a dica de ferramenta, ou adicion-lo ao formulrio.
3. Na janela Properties, defina o ToolTip on ToolTip1 valor como uma seqncia de texto apropriada.
Visual C# Consolidado
789
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).
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.
Visual C# Consolidado
790
O exemplo de cdigo a seguir aplica a qualquer controle que mantm um conjunto de controles dentro dela. Para adicionar um controle a uma coleo programaticamente 1. 2. 3. Criar uma instncia do controle a ser adicionado. Definir propriedades do novo controle. Adicione o controle coleo Controls do controle pai.
O exemplo de cdigo a seguir mostra como criar uma instncia do controle Button. Ele requer um formulrio com um Panel controle e que o mtodo tratamento de eventos para o boto sendo criada NewPanelButton_Click,. j existe C#
public Button newPanelButton = new Button(); public void addNewControl() { // The Add method will accept as a parameter any object that derives // from the Control class. In this case, it is a Button control. panel1.Controls.Add(newPanelButton); // The event handler indicated for the Click event in the code // below is used as an example. Substite the appropriate event // handler for your application. this.newPanelButton.Click += new System.EventHandler(this. NewPanelButton_Click); }
Para remover controles de uma coleo programaticamente 1. Remover o manipulador de eventos do evento. No Visual Basic, use a Instruo RemoveHandler palavra-chave; no Visual C#, use o = Operador (referncia C#). 2. 3. C#
private void removeControl(object sender, System.EventArgs e) { // NOTE: The code below uses the instance of // the button (newPanelButton) from the previous example. if(panel1.Controls.Contains(newPanelButton)) { this.newPanelButton.Click -= new System.EventHandler(this. NewPanelButton_Click); panel1.Controls.Remove(newPanelButton); newPanelButton.Dispose(); } }
Use o Remove mtodo para excluir o controle desejado do painel na Controls coleo. Chamar o Dispose mtodo para verso todos os recursos usado pelo controle.
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
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.
Visual C# Consolidado
793
Para fazer um formulrio o formulrio mais alto-em uma aplicativo do Windows Forms programaticamente
C#
public void MakeOnTop() { myTopForm.TopMost = true; }
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
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..
Visual C# Consolidado
795
1. No Visual Basic, inserir duas aspas em uma linha como uma marca cotao incorporada. Em Visual C# \ " como uma marca cotao incorporada. e Visual C++, insira a seqncia de escape Por exemplo, para criar a seqncia anterior, use o cdigo a seguir. C#
private void InsertQuote(){ textBox1.Text = "She said, \"You deserve a treat!\" "; }
- ou 2. Insira o caractere ASCII ou Unicode para uma aspa. No Visual Basic, use o caractere ASCII (34). In Visual C#, use the Unicode character (\u0022). C#
private void InsertAscii(){ textBox1.Text = "She said, " + '\u0022' + "You deserve a treat!" + '\u0022'; }
Observao In this example, you cannot use \u0022 because you cannot use a universal character name that designates a character in the basic character set. Caso contrrio, voc produzir C3851. For more information, see Compilador C3851 de erro. - ou 3. C#
const string quote = "\""; textBox1.Text = "She said, " + quote + "You deserve a treat!"+ quote ;
Voc tambm pode definir uma constante para o caractere, e us-la quando necessrio.
Visual C# Consolidado
796
Para exibir um retorno de carro em uma vrias linhas TextBox, use a NewLine propriedade. Esteja ciente que a interpretao de caracteres de escape ( especfico de idioma. Visual Basic usa Chr$(13) & Chr$(10) para retorno de carro e alimentao de linha a combinao de caracteres.
Para exibir vrias linhas no controle TextBox 1. Defina a Multiline propriedade para true. Se WordWrap ser true (o padro), em seguida, o texto no controle ser exibida como um ou mais pargrafos; caso contrrio, ele aparecer como uma lista, em que algumas linhas podem ser cortadas na borda do controle. Defina a ScrollBars propriedade como um valor apropriado. Value (Valor) None Descrio Use esse valor se o texto ser um pargrafo que. quase sempre ajusta o controle O usurio pode usar o ponteiro do mouse para mover-se dentro do controle se o texto for muito longa para exibir todos de uma vez. Use esse valor se voc deseja exibir uma lista de linhas, alguns dos que podem estar maior que a largura do controle TextBox. Use esse valor se a lista pode ser maior que a altura do controle.
2.
Horizontal Both 3.
Defina a WordWrap propriedade como um valor apropriado. Value (Valor) false Descrio Texto no controle no automaticamente ser ser disposto, para que ele ir rolar para a direita at que uma quebra de linha seja alcanada. Use esse valor se voc escolheu Horizontal barras de rolagem ou Both, acima. A barra de rolagem horizontal no ser exibido. Use esse valor se voc escolheu Vertical barras de rolagem ou None, acima, para exibir um ou mais pargrafos.
(true padro)
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.
Se seu aplicativo ou outro aplicativo est fazendo demandas pesadas no sistema , como loops longos, intenso clculos, ou unidade, rede, ou acesso da porta seu aplicativo pode possvel obter eventos timer com freqncia como a Interval propriedade especifica. O intervalo pode ser entre 1 e 64,767, inclusive, que significa que mesmo o intervalo mais longo no muito maior que um minuto 64.8 sobre (segundos). O intervalo no garantido para decorrer exatamente no tempo. Para garantir a preciso, o timer deve verificar o relgio do sistema conforme necessrio, em vez de tentar se manter controle de tempo acumulado internamente. O sistema gera 18 pulsos do relgio por segundo to mesmo embora a Interval propriedade medida em milissegundos, a preciso de um intervalo VERDADEIRO mais de um-eighteenth de um segundo.
Como executar procedimentos na intervalos do conjunto com o componente Timer Windows Forms:
s vezes, convm criar um procedimento que executa em intervalos especficos de tempo at que um loop foi concluda ou que seja executado quando um intervalo de tempo definido tiver decorrido. O Timer componente permite tal um procedimento. Este componente projetado para um ambiente Windows Forms. Se voc precisar um timer que adequado para um ambiente de servidor, consulte Introduo ao timers Based Server-. Observao Existem algumas limitaes ao usar o Timer Componente. Para obter mais informaes, consulte Limitaes do componente Timer de formulrios do Windows na propriedade Interval. Para executar um procedimento em intervalos definidos com o componente timer
Visual C# Consolidado
798
1.
Adicionar ao seu formulrio. um Timer Consulte a seo exemplo a seguir para obter uma ilustrao de como fazer isso programaticamente. Tambm Visual Studio oferece suporte para adicionar componentes a um formulrio. Defina a Interval propriedade (em milissegundos) para o timer. Esta propriedade determina quanto tempo ir passar antes o procedimento executado novamente. Observao Quanto maior a freqncia de um evento Timer ocorrer, mais tempo do processador usado em responder ao evento. Isso pode diminuir o desempenho geral. No defina um intervalo menor do que voc precisa.
2.
3. 4. 5.
Escreva cdigo apropriado no manipulador Tick de eventos. O cdigo voc escreve nesse evento ser executado no intervalo especificado na propriedade Interval. Defina a Enabled propriedade para true Para iniciar o cronmetro. O Tick evento comear a ocorrer, executar o procedimento no intervalo conjunto. Ao tempo apropriado, defina a Enabled propriedade como false para interromper o procedimento seja executado novamente. Definir o intervalo para 0 no faz com que o timer para parar.
Exemplo Este primeiro exemplo de cdigo controla a hora do dia em incrementos um segundo. Ele usa um Button, a Label, e um Timer componente em um formulrio. A Interval propriedade definida como 1000 (igual a um segundo). No evento Tick, legenda do rtulo definida como a hora atual. Quando o boto for clicado, a Enabled propriedade definida como false, interrompendo o timer de atualizar legenda do rtulo. O exemplo de cdigo a seguir requer que voc tenha um formulrio com um Button controle denominado Button1, um Timer controle chamado Timer1, e um Label controle chamado Label1. C#
private void InitializeTimer() { //' Run this procedure in an appropriate event. // Set to 1 second. Timer1.Interval = 1000; // Enable timer. Timer1.Enabled = true; Button1.Text = "Stop"; } private void Timer1_Tick(object Sender, EventArgs e) { // Set the caption to the current time. Label1.Text = DateTime.Now.ToString(); } private void Button1_Click() { if ( Button1.Text == "Stop" ) { Button1.Text = "Start"; Timer1.Enabled = false; } else { Button1.Text = "Stop"; Timer1.Enabled = true; } }
Este exemplo de cdigo segundo executa um procedimento cada milissegundos 600 at que um loop tenha terminado. O exemplo de cdigo a seguir requer que voc tenha um formulrio com um Button controle denominado Button1, um Timer controle chamado Timer1, e um Label controle chamado Label1. C#
// This variable will be the loop counter. private int counter; private void InitializeTimer() { // Run this procedure in an appropriate event. counter = 0; timer1.Interval = 600; timer1.Enabled = true; // Hook up timer's tick event handler. this.timer1.Tick += new System.EventHandler(this.timer1_Tick); } private void timer1_Tick(object sender, System.EventArgs e) { if (counter >= 10) { // Exit loop code. timer1.Enabled = false; counter = 0; } else { // Run your procedure here. // Increment counter. counter = counter + 1; label1.Text = "Procedures Run: " + counter.ToString(); } }
Visual C# Consolidado
799
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,
Visual C# Consolidado
801
2. ( 3. 4.
Na janela Properties, clique na Buttons propriedade para selecion-lo e clique no Ellipsis. ) boto para abrir o ToolBarButton Collection Editor Uso e Remove botes para adicionar e remover botes do controle ToolBar. o Add
Configurar as propriedades dos botes individuais na janela Properties que aparece no painel no lado direito do editor. A tabela a seguir mostra algumas propriedades importantes a considerar. Propriedade Descrio
DropDownMenu Define o menu exibido em no boto da barra de ferramentas drop-down. Defina a DropDownButton propriedade do boto Style Barra de ferramentas. Essa propriedade tem uma instncia da classe ContextMenu como uma referncia. PartialPush Define se um boto da barra de ferramentas Estilo toggle- parcialmente pressionado. Defina a ToggleButton propriedade do boto Style Barra de ferramentas. Define se um boto da barra de ferramentas Estilo toggle-est atualmente no estado pushed. Propriedade do boto Style Barra de ferramentas deve ser definida para ToggleButton ou PushButton.. ou PushButton Define o estilo do boto da barra de ferramentas. Deve ser um dos valores na enumerao ToolBarButtonStyle. A seqncia de texto exibido pelo boto. O texto que aparece como uma dica de ferramenta para o boto.
Pushed
Visual C# Consolidado
802
Visual C# Consolidado
803
5. 6.
Use o Add boto para adicionar botes para o ToolBar controle. Na janela Properties que aparece no painel no lado direito do conjunto ToolBarButton Collection Editor, a ImageIndex propriedade de cada barra de ferramentas boto para um dos valores na lista, que desenhado entre as imagens adicionadas ao ImageList componente.
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
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.
Visual C# Consolidado
806
Modelo Code-Behind Melhorado Controles Controle e Ligao de Dados Converso de Sites Web Existentes
Para informaes sobre novos recursos no ASP.NET 2.0, consulte O que h de novo no ASP.NET Web Sites e Projetos O Visual Web Developer apresenta uma abordagem flexvel para a criao de web sites (tambm chamados projetos e aplicaes web em verses anteriores do Visual Web Developer e Web Page Designer, respectivamente). Web sites no Visual Web Developer no so, necessariamente, vinculados ao IIS nem a pastas fsicas da raiz do IIS. Agora voc pode criar os seguintes tipos de web sites:
Sistema de Arquivos. Voc pode manter todos os arquivos de um site em uma pasta simples. O sistema de arquivos de web sites no dependem do IIS. Para obter detalhes, consulte Passo-a-passo: Criando uma pgina da web bsica no Visual Web Developer.
IIS Local. Como nas verses anteriores do Visual Studio, voc pode criar aplicativos do IIS que podem residir na raiz local do IIS ou em um diretrio virtual. Voc tambm pode criar pastas virtuais. Para obter detalhes, consulte Passo-a-passo: Acesso a Dados Bsico em Pginas da Web.
Remoto. Voc pode criar aplicativos residentes em servidores remotos que oferecem suporte ao FrontPage 2002 Server Extensions da Microsoft. Este o modelo que foi usado em verses anteriores do Visual Web Developer e continua recebendo suporte nesta verso.
FTP. Voc pode abrir web sites atravs de FTP. Para obter detalhes, consulte Passo-a-passo: Edio de Web Sites com FTP no Visual Web Developer.
Servidor de Desenvolvimento do ASP.NET A ferramenta de desenvolvimento Web do Visual Web Developer inclui um servidor de aplicao de teste simplificado, o ASP.NET Development Server, que voc pode usar para testar sistemas de arquivos de web sites, sem precisar utilizar o IIS. Para mais informaes, consulte Servidores Web no Visual Web Developer. Projetos Na nova verso do Visual Web Developer, web sites no dependem de arquivos de projeto e de soluo. Voc pode adicionar arquivos a um web site no Visual Web Developer, ou usar o Microsoft Windows Explorer, e os arquivos so automaticamente parte do web site. O Visual Web Developer ainda cria arquivos de projeto e de soluo para armazenar uma pequena quantidade de informaes especficas de projeto, como as configuraes IDE. Boa parte das informaes que anteriormente eram armazenadas em arquivos de projeto, agora so armazenadas no arquivo Web.config, como configuraes padro do ASP.NET 2.0, ou no so mais necessrias. O arquivo de projeto no armazena informao necessria para executar o aplicativo.
Visual C# Consolidado
807
Trabalhar sem um modelo de projeto no somente torna possvel adicionar, editar e remover arquivos de fora do Visual Web Developer, como tambm torna mais fcil a mais de um desenvolvedor trabalhar juntos para criar um site. Mais de um desenvolvedor pode adicionar ou remover arquivos de um web site sem exigir acesso a um arquivo centralizado de projeto, que precisa ser atualizado com as informaes do arquivo. Alm disso, mais fcil manter arquivos do web site em um sistema controlado por origem, como o sistema de controle de verso do Microsoft Visual SourceSafe, porque os desenvolvedores no tm, exclusivamente, que fazer o check-out em um arquivo de projeto para adicionar arquivos ao web site. Modelo de Compilao Dinmica No Visual Web Developer, web sites no usam mais o modelo de compilao que foi usado em verses anteriores, no qual o cdigo executvel do projeto inteiro era compilado em um nico assembly. Em vez disso, como padro, a nova verso usa o modelo de compilao dinmica que nativo para o ASP.NET 2.0. Trabalhar com web sites que no produzem um assembly executvel como sada tem vrias vantagens:
Voc pode testar web sites que contm pginas ainda em desenvolvimento pginas que contm erros de compilao no impedem que outras pginas do web site sejam executadas. Para desenvolvimento em web sites grandes, no necessrio que a aplicao inteira seja recompilada sempre que uma alterao feita a uma pgina nica ou componente. Quando um desenvolvedor altera uma nica pgina, somente essa pgina recompilada quando ela solicitada em seguida. Diferentes desenvolvedores podem fazer edies em diferentes pginas ao mesmo tempo, sem interferir nas alteraes do outro, como pode acontecer quando se compila o projeto para um assembly nico no Microsoft Visual Studio .NET 2003.
Quando voc testa um web site, ele ainda compilado (built). Entretanto, a etapa de compilao usada como verificao, tal que que todas as pginas e suas dependncias possam ser compiladas; a sada do processo de compilao no usada como base para executar o web site. Essa etapa de compilao mais abrangente do que era em verses anteriores porque ele valida no apenas a compilao do cdigo como tambm, a localizao de erros na sintaxe de marcao e no arquivo Web.config. Publicao de Web Sites Por alguns desenvolvedores no optarem pela implantao de cdigo fonte nos seus web sites, a ferramenta de desenvolvimento da Web, o Visual Web Developer, oferece a opo de prcompilao e implantao de um web site usando o comando Build Web Site. O comando Build Web Site executa o compilador sobre o site inteiro (no apenas nos arquivos de cdigo), e produz um layout de web site que voc pode implantar em um servidor de produo. O layout inclui assemblies para pginas individuais, que incluem o cdigo e a marcao para a pgina (ou seja, os arquivos .aspx so compilados tambm). Observao Esta propriedade no est disponvel no Visual Web Developer Express Edition. O benefcio principal da pr-compilao que ela permite que voc implante apenas cdigo executvel, colocando uma medida de proteo em sua propriedade intelectual. Alm disso, a prcompilao localiza qualquer erro em tempo de compilao, em pginas ou cdigo dependente.
Visual C# Consolidado
808
Finalmente, a pr-compilao melhora o desempenho e reduz o tempo que leva para as pginas de seu web site processarem na primeira vez. Edio de pginas O Visual Web Developer oferece os seguintes aperfeioamentos para criar e editar pginas da web:
Suporte a novos recursos de pgina. O Web Page Designer do Visual Web Developer apresenta suporte WYSIWYG para os novos elementos de pgina do ASP.NET 2.0, como em pginas mestras. Para obter detalhes, consulte Viso Geral Sobre Pginas Mestras do ASP.NET e Passo-a-passo: Criando e Usando Pginas-Mestre do ASP.NET no Visual Web Developer.
Preservao do cdigo fonte. O Visual Web Developer mantm a formatao HTML da sua pgina quando voc alterna entre o modo Design e o Source, e quando voc salva os arquivos.
Gerao e Validao de HTML Avanadas. O Visual Web Developer oferece mais opes para gerar e validar o HTML da sua pgina. Como padro, o Web Page Designer cria uma marcao que compatvel com XHTML 1.1, e novos esquemas incluem suporte para diversas variaes de XHTML. Voc pode definir opes para determinar como, estritamente, o Visual Web Developer deve validar os elementos em sua pgina e HTML. Alm disso, o Visual Web Developer fornece informaes de erro em ToolTips.
Funcionalidade da ao Arrastar-e-Soltar no modo Source. Voc pode arrastar controles da Toolbox (caixa de ferramentas) enquanto estiver no modo Source.
Programao O Visual Web Developer inclui uma srie de aperfeioamentos para o editor de cdigos que o ajudam a programar mais produtivamente. Ele inclui o seguinte:
Tecnologia Microsoft IntelliSense. A concluso de instruo est em praticamente todos os locais quando voc edita pginas da Web. A tecnologia IntelliSense ajuda a criar cdigo code-behind e pginas de arquivo nico, tags de marcao, diretivas de pginas e assim por diante.
Evento de listas suspensas. Voc pode criar manipuladores de evento no modo Fonte usando eventos de lista suspensa, como voc poderia fazer anteriormente somente no modo Cdigo. A janela Properties agora permite que voc crie manipuladores de eventos para o Visual Basic e C#.
Suporte a pginas de arquivo nico. O Editor de cdigos agora fornece suporte equivalente para code-behind e pginas de arquivo nico em ASP.NET 2.0. (Para informaes sobre alteraes para o modelo code-behind, consulte Modelo Code-Behind Aperfeioado.) Ambos os modelos de cdigo suportam colorao de sintaxe, tecnologia IntelliSense e assim por diante.
Cdigo compartilhado. Classes para as quais o cdigo fonte est na pasta App_Code de sua aplicao da web so automaticamente referenciadas; se voc tiver compilado componentes, voc pode inseri-los na pasta Bin para que o Visual Web Developer os referencie automaticamente. A funcionalidade IntelliSense obtm informaes sobre qualquer componente que estiver instalada na pasta
Visual C# Consolidado
809
App_Code ou Bin, de sua aplicao. Para obter detalhes, consulte Passo-a-passo: Usando Cdigo Compartilhado em Web Sites no Visual Web Developer.
Depurao. Voc tem facilidades completas de depurao para Web Sites locais, incluindo arquivos de sistema. A depurao menos complexa e mais rpida do que nas verses anteriores. Para obter detalhes, consulte Passo-a-passo: Depurao de Pginas da Web no Visual Web Developer.
Modelo Code-Behind Aperfeioado Uma diferena significativa entre verses anteriores do Visual Web Developer e esta verso est no funcionamento de pginas code-behind. No Microsoft Visual Studio .NET 2002, quando voc cria pgina de Web Forms, o Visual Web Developer cria um arquivo .aspx com uma marcao e um arquivo .vb ou .cs separado (o arquivo code-behind) para o cdigo da pgina. O arquivo codebehind define uma classe completa que derivada da classe Page. O Web Page Designer guarda o arquivo .aspx e o arquivo code-behind na sincronizao. Por exemplo, se voc adicionou um controle de servidor web ao arquivo .aspx, o Web Page Designer criou uma varivel de instncia correspondente no arquivo code-behind para aquele controle. Nesta verso, o modelo code-behind tira proveito de um novo recurso de linguagem, conhecido como classes parciais. O arquivo code-behind para uma pgina no uma definio completa de classe. Em vez disso, ele inclui somente o cdigo do aplicativo que voc precisa, como manipuladores de eventos. A classe parcial code-behind no necessita incluir variveis de instncia; o ASP.NET 2.0 infere as instncias de controle da marcao, no tempo de compilao. Se voc estiver programando em C#, voc no precisa incluir representantes explcitos para vinculao de evento, porque o ASP.NET 2.0 pode deduzi-los dos atributos de evento (por exemplo, onclick) na marcao de controle. No Visual Basic, voc pode adicionar uma clusula Handles para a declarao de um mtodo de evento, como no modelo anterior, para vincular o evento ao manipulador. O novo modelo code-behind oferece uma srie de vantagens sobre o modelo anterior, da seguinte maneira:
Separao verdadeira de cdigo e marcao. Em verses anteriores, a marcao e o cdigo eram armazenados em arquivos separados. Verses anteriores necessitavam manter os arquivos em sincronizao usando variveis de instncia e representantes de evento. No entanto, no era prtico trabalhar com os arquivos separados. Por exemplo, no era prtico para um desenvolvedor de pgina trabalhar no layout de uma pgina enquanto outro desenvolvedor trabalhava no cdigo. Nesta verso, isso muito mais prtico.
Menos complexidade na referncia de controles. Conforme observado, o novo modelo code-behind no requer variveis de instncia explcitas na pgina code-behind. Embora verses anteriores gerenciassem variveis de instncia, no a faziam para todos os controles notadamente para controles de usurio ou para alguns elementos HTML que foram declarados como controles. Nesta verso, devido ao fato de nenhuma varivel de instncia ser necessria, todos os controles, incluindo controles de usurio, so referenciados implicitamente.
Menos gerao de cdigo. O novo modelo code-behind no contm praticamente nenhum cdigo gerado alm da prpria definio de classe. No h nenhuma rea reservada no code-behind que o editor possa sobrescrever.
Controles
Visual C# Consolidado
810
O Visual Web Developer oferece suporte aos novos controles ASP.NET 2.0, cujas novas funcionalidades resultam no aumento significativo da produtividade. Alm dos novos controles de hospedagem, o Web Page Designer inclui melhoras para ajud-lo a trabalhar mais facilmente com controles. Destaques incluem o seguinte:
Modelo de edio mais consistente e eficiente. O modelo geral para trabalhar com controles mais consistente entre os controles e permite que voc execute vrias outras aes sem precisar usar a janela Properties ou editar a sintaxe declarativa de um controle.
Exibio visual de controles. O Web Page Designer melhorou o suporte para processamento de controles, por exemplo, os controles de usurio so agora processados visualmente no modo Design.
Edio baseada em tarefa. Quando voc trabalha com controles, eles exibem um menu de marcas inteligentes (um menu flutuante de atalho de tarefas) para o controle atual. Aes tpicas que so oferecidas pela edio baseada em tarefas incluem edio de modelos e configurao de dados vinculados.
Edio de modelo. O Web Page Designer fornece uma interface simplificada e mais intuitiva para criar e editar modelos em controles complexos, como o controle DataList e o GridView.
Edio de Tabela. muito mais fcil agora criar e editar tabelas HTML no Web Page Designer. Para obter detalhes, consulte Passo-a-passo: Editando Tabelas HTML no Visual Web Developer.
Extensibilidade de Controle Agora voc pode estender controles de novas e eficientes maneiras. Como antes, voc pode criar controles de usurio e controles personalizados. Esta verso da ferramenta de desenvolvimento da Web, o Visual Web Developer, fornece suporte aprimorado para controles de usurio, incluindo processamento WYSIWYG no modo Design e janela Properties de suporte. Voc pode estender o comportamento em tempo de execuo dos controles criando adaptadores que definem a sada do controle para um dispositivo especfico ou navegador. Em tempo de execuo, o ASP.NET 2.0 determina o tipo de dispositivo que gerou a solicitao e chama um adaptador de controle para processar a sada apropriada para este dispositivo, para um dado controle. Criando um adaptador para um controle e uma classe especfica de dispositivo, voc pode personalizar a sada para o controle do dispositivo. Adaptadores so especialmente teis para criar processamento personalizado para novos dispositivos. Para mais informaes, consulte Criao de Adaptadores de Controle do Servidor ASP.NET - Uma Introduo. Se voc desenvolver controles comuns, voc ter melhorado o suporte para hospedar seu controle em um Web Page Designer, incluindo o seguinte:
Classes que permitem que voc adicione edio baseada em regio aos controles em tempo de design. Suporte a edio baseada em tarefas, de modo que voc possa definir verbos (tarefas) que so expostos para o controle usando atalhos de menu no Web Page Designer. Servios de edio de modelos que simplificam a adio de suporte para modelos nos controles. Controles podem se beneficiar dos servios baseados em ferramentas para melhor interagir com o ambiente de hospedagem. Por exemplo, controles tem acesso diretiva de pgina, ao sistema do projeto e ao documento atual.
Visual C# Consolidado
811
Controles de Dados e Vinculao de Dados Trabalhar com dados uma parte importante em muitas pginas web em ASP.NET 2.0, e o Visual Web Developer inclui vrios aprimoramentos para facilitar a implementao e gerenciamento do acesso a dados. O objetivo geral para a vinculao de dados no ASP.NET 2.0 tornar possvel a realizao de uma variedade de cenrios de vinculao de dados, sem precisar gravar qualquer cdigo. Esta verso suporta essa meta e a estende oferecendo assistentes que o ajudam a configurar a vinculao de dados e criao de componentes de dados. Ligao de Dados com Controles de Fonte de Dados O modelo para vincular controles de pgina a fontes de dados foi aperfeioado consideravelmente. O modelo de vinculao de dados do Microsoft Visual Studio .NET 2002 necessitava que voc adicionasse componentes de dados como objetos e conexes dataset na pgina. Em seguida, voc precisava escrever o cdigo para gerenciar dados vinculando a controles de dados, como o controle DataList e o DataGrid. Para simplificar vinculao de dados, o ASP.NET 2.0 introduz controles de fonte de dados. Controles de fonte de dados fornecem um nico objeto no qual voc pode, declarativamente, definir o seguinte:
Informaes de conexo. Consultas (um instruo SQL, nome de parmetro armazenado ou nomes dos mtodos para chamar em um objeto). Parmetros Voc pode definir parmetros declarativamente e especificar que eles obtenham seus valores de um controle na pgina, de uma seqncia de caracteres de consulta, de variveis de sesso ou de outras fontes. As opes de comportamento (dependendo do controle da fonte de dados), como paginao e cache.
Em geral, voc no precisa trabalhar diretamente com os objetos que so usados para gerenciar acesso a dados, como datasets ou leitores de dados. Controles de fonte de dados criam componentes de dados de forma transparente. Voc no trabalha com esses componentes, mas no precisa estar ciente deles quando desejar usar um recurso, como o de paginao, que depende da escolha entre um dataset e um leitor de dados. O ASP.NET 2.0 fornece controles de fonte de dados para diferentes tipos de armazenamentos de dados, incluindo SQL (para OLE DB e bancos de dados Open Database Connectivity [ODBC]), arquivos XML e objetos comerciais. Todos os controles de fonte de dados expem a mesma interface para controles de dados na pgina, como o controle DataList e o Repeater, e o novo controle GridView pode ligar o mesmo caminho a qualquer controle de fonte de dados, apesar do armazenamento de dados subjacente que eles representam, e depois mostra os dados na pgina. O resultado que voc pode usar a matriz completa dos controles de dados do ASP.NET 2.0 para trabalhar com uma ampla variedade de fontes de dados. Para ajud-lo a criar e configurar controles de fonte dados, a ferramenta de desenvolvimento da Web, o Visual Web Developer, inclui assistentes que o ajudam a criar conexes, definir consultas ou especificar mtodos para chamar e configurar parmetros. Controles de dados avanados Todos os controles de dados no ASP.NET 2.0 foram aprimorados para trabalhar com controles de fonte de dados. Em vez de apontar um controle em um dataset ou leitor de dados, voc referencia um controle de fonte de dados. Depois, o controle de dados e o controle da fonte de dados
Visual C# Consolidado
812
trabalham juntos para gerenciar, automaticamente, a vinculao de dados, para que na maioria dos casos, voc no precise escrever cdigo para executar a vinculao. Como resultado, voc pode tirar proveito da vinculao de dados automtica, em qualquer controle de vinculao de dados. Alm disso, o ASP.NET 2.0 introduz novos controles de dados que fornecem funcionalidades adicionais. Eles incluem o seguinte:
O controle GridView, que o sucessor do controle DataGrid. O controle GridView automatiza muitos dos recursos do controle DataGrid, para que voc no precise escrever cdigo para edio, classificao ou paginao. Para situaes em que voc desejar personalizar o comportamento do controle, voc pode continuar usando o modelo de objeto que voc estiver familiarizado a partir do controle DataGrid.
O controle DetailsView exibe um registro por vez e permite que voc edite, exclua e insira registros. Voc pode tambm paginar atravs de vrios registros. O controle FormView semelhante ao controle DetailsView, mas permite que voc defina um layout de forma livre para cada registro. O controle FormView como um controle DataList para um registro individual.
Voc pode continuar usando o controle DataGrid, embora ele seja substitudo pelo controle GridView. Pginas existentes que usam o controle DataGrid trabalham como so. Como em outros controles de dados, o controle DataGrid foi aprimorado para interagir com controles de fonte de dados. Vinculao bidirecional de dados A combinao de controles de fonte de dados, parmetros declarativos e controles de dados avanados fornece a capacidade para criar vinculao bidirecional de dados, sem precisar escrever cdigo. Nos controles de fonte de dados, voc pode definir consultas ou nomes de mtodos a serem usados para atualizaes. Controles de dados, como o controle GridView, DetailsView e FormView, suportam modos de edio e excluso (e para alguns controles, modo de insero) que automaticamente podem interagir com os controles de fonte de dados, para gravar dados na fonte de dados. Armazenamento de seqncia de caracteres de conexo Para ajudar a tornar seus sites mais manutenveis e mais seguros, voc pode manter as seqncias de caracteres de conexo no arquivo Web.config em uma nova seo, que foi desenvolvida especificamente para armazenamento de seqncia de caracteres de conexo. Quando utilizar a ferramenta de desenvolvimento da Web, o Visual Web Developer, para criar ou configurar controles de fonte de dados, voc pode especificar que a seqncia de caracteres de conexo seja armazenada no arquivo Web.config. Se voc alterar as fontes de dados, voc pode facilmente alterar a seqncia de caracteres de conexo em um local, ao invs de ter que atualizar todos os componentes de dados em todas as pginas, com uma nova seqncia de caracteres de conexo. Para segurana adicional, voc pode criptografar a seo de seqncia de caracteres de conexo do arquivo Web.config. Para obter detalhes, consulte Criptografar informaes de configurao usando configurao protegida. Acesso a dados em duas e trs camadas O modelo anterior de vinculao de dados incentivava a criao de solues de dados em duas camadas, na qual as pginas da Web interagiam diretamente com o banco de dados para preencher o dataset e para vincular controles a ele. O novo modelo continua facilitando o trabalho em uma estrutura em duas camadas. Por exemplo, o controle SqlDataSource se conecta
Visual C# Consolidado
813
diretamente a um banco de dados e executa instrues SQL ou procedimentos para ler e gravar dados armazenados. O novo modelo de vinculao de dados tambm torna mais fcil criar uma estrutura em trs camadas na qual o acesso a dados tratado por um objeto corporativo de camada intermediria. O controle ObjectDataSource interage com um objeto corporativo chamando mtodos no objeto para recuperar e atualizar dados. Controles de dados em uma pgina podem se vincular ao controle ObjectDataSource da mesma maneira como eles fazem a quaisquer outros controles de fonte de dados, como o controle SqlDataSource. A ferramenta de desenvolvimento da Web, o Visual Web Developer, inclui um assistente de componente de dados que ajuda a criar um objeto personalizado que contm mtodos para ler e atualizar dados. Como alternativa, voc pode criar seu prprio objeto de camada intermediria que contm mtodos. Enquanto seu objeto personalizado expe os mtodos com as assinaturas apropriadas, voc pode referenci-los de um controle ObjectDataSource. Para obter detalhes, consulte Passo-a-passo: Vinculao de Dados Para Um Objeto Corporativo Personalizado. Compatibilidade com Verses Anteriores para Acesso a Dados A ferramenta de desenvolvimento da Web, o Visual Web Developer, continua oferecendo suporte a pginas que usam o modelo de vinculao de dados de verses anteriores. Pginas que contm datasets e outros componentes executam como faziam antes, e voc pode abrir e editar as pginas no Web Page Designer. O Visual Web Developer no remove os componentes de dados e no converte os componentes para controles de fonte de dados. Observao Componentes de dados, como datasets e conexes de dados, no so mostrados no Web Page Designer do Visual Web Developer. Portanto, voc no pode definir, nem examinar as propriedades usando a janela Properties. Entretanto, voc ainda pode editar o cdigo que usado para instanciar os componentes de dados e definir suas propriedades. Para obter mais informaes, consulte Viso Geral de Controles de Fonte de Dados e Passo-apasso: Acesso Bsico a Dados em Pginas da Web. Convertendo sites da Web existentes O Visual Web Developer, pode converter automaticamente seus projetos existentes para o novo e modernizado layout de site. O processo de converso preserva a funcionalidade de seu aplicativo e as opes de projeto que so aplicadas. Pginas da Web code-behind existentes so convertidas em um novo modelo code-behind que preserva a separao de HTML e cdigo, mas fornece uma estrutura simplificada. Para mais informaes, consulte Converso do Projeto Da Web no Visual Studio.NET. Aps a converso, voc pode usar o Web Page Designer para trabalhar com pginas e controles que foram desenvolvidos em verses anteriores do Visual Web Developer.
Visual C# Consolidado
814
2. 3.
4.
5. 6. 7.
Esse ciclo continua, enquanto o usurio estiver trabalhando na pgina. Cada vez que um boto clicado, a informao na pgina remetida para o servidor Web e a pgina executada novamente. Cada ciclo conhecido como um round trip(processamento). Como o processamento da pgina ocorre no servidor Web, cada ao que pode fazer a pgina requer um round trip para o servidor. Observao
Visual C# Consolidado
815
Uma pgina da Web do ASP.NET pode executar scripts de cliente, o que no requer um round trip para o servidor, e que til para validao de entrada de usurio e para alguns tipos de interface de programao. Para obter mais informaes, consulte Programando pginas da Web do ASP.NET com script de cliente. Postagem cruzada de pginas Em algumas circunstncias, voc pode querer que uma pgina poste para uma pgina diferente, no a si prpria. Isso chamado de da cross-page posting(postagem cruzada de pgina). Por exemplo, voc pode ir criando uma srie de pginas que processam um pedido do cliente. Cada pgina pode enviar para a prxima pgina na seqncia. Para obter mais informaes, consulte Postagem entre Pginas em Pginas da Web do ASP.NET. Vida til da pgina Diferente de formulrios em aplicativos desktop, uma pgina da Web do ASP.NET no inicializada, executa enquanto o usurio trabalha com o formulrio, e depois descarrega somente quando o usurio clicar um boto Close (fechar). Isso ocorre porque a Web est desconectada inerentemente. Quando um navegador solicita uma pgina de um servidor Web, o navegador e o servidor esto conectados somente durante tempo suficiente para processar a solicitao. Depois que o servidor Web tenha processado uma pgina para o navegador, a conexo encerrada. Se o navegador fizer outra solicitao para o mesmo servidor Web, mesmo para a mesma pgina, a solicitao ser processada como uma nova solicitao. A natureza desconectada da Web determina a maneira que uma pgina ASP.NET executa. Quando um usurio solicita uma pgina da Web do ASP.NET, uma nova instncia da pgina criada. A pgina executa seu processamento, processa a marcao para o navegador, e descartada. Se o usurio clica em um boto para executar uma nova postagem, uma nova instncia da pgina criada, a pgina executa seu processamento, e novamente ser descartada. Assim, cada nova postagem e round trip resulta em uma nova instncia da pgina. Para obter mais informaes, consulte Pginas da Web ASP.NET. Preservando o estado da pgina No protocolo normal HTTP, a nica informao que o servidor tem sobre uma pgina a informao que o usurio especificou usando controles na pgina, porque o navegador envia somente essas informaes para o servidor quando a pgina postada. Outras informaes, tais como valores de varivel e definies de propriedade, so descartadas. ASP.NET ajuda a preservar outras informaes de pgina das seguintes maneiras:
ASP.NET salva as configuraes de controle (propriedades) entre round trips, que chamada de salvar o estado de controle. O ASP.NET fornece recursos de gerenciamento de estado para que voc possa salvar suas prprias variveis e informaes especficas do aplicativo ou informaes especficas de sesso entre as round trips. ASP.NET pode detectar quando uma pgina solicitada pela primeira vez e quando a pgina enviada, o que lhe permite programar adequadamente. Por exemplo, voc talvez queira ler informaes de um banco de dados na primeira vez que uma pgina exibida, mas no em cada novo postback. Observao
Visual C# Consolidado
816
O servidor pode ser configurado para guardar informaes de pgina para otimizar as pginas, mas para fins de programao de aplicativos, melhor pensar em pginas como sendo descartadas assim que o servidor terminar seu processamento. Para obter mais informaes, consulte Viso Geral sobre o Gerenciamento de Estado do ASP.NET. Programando pginas da Web ASP.NET Voc pode criar o cdigo de servidor para suas pginas da Web ASP.NET usando uma variedade de idiomas no.NET Framework, incluindo Visual Basic, C#, e J#. As pginas da Web ASP.NET podem conter scripts de cliente que executam dentro do navegador. Algumas funes ASP.NET geram scripts de cliente e inserem-nos na pgina. Nesse caso, ASP.NET sempre gera ECMAScript (JavaScript) para melhor funcionalidade de navegadores cruzados. Alm disso, voc pode adicionar seus prprios scripts de cliente para funcionalidade personalizada. Se fizer isso, voc pode utilizar qualquer linguagem de script de cliente que seja compatvel com os navegadores que voc estiver como objetivo. Controles de servidor Como qualquer pgina da Web, as pginas da Web ASP.NET podem conter texto esttico. Com mais freqncia, entretanto, voc adicionar controles para a pgina, como caixas de texto, caixas de seleo e botes. Esses controles permitem ao usurio interagir com a pgina e enviar informaes para o servidor quando a pgina remetida novamente. O ASP.NET fornece um conjunto de controles conhecido como controles do servidor Web. Controles do servidor ASP.NET podem ser semelhante aos elementos de formulrios HTML correspondentes. Por exemplo, o controle ASP.NET TextBox semelhante a um marcador HTML <input type="text">. Entretanto, os controles do servidor ASP.NET oferecem uma experincia de programao mais enriquecedora de elementos HTML. H tambm controles do servidor ASP.NET para um intervalo muito maior de funes que o que oferecido pelos elementos HTML. Entre os controles do servidor que podem ser usados em um pgina da Web do ASP.NET est um controle de calendrio, controles com dados vinculados que exibem listas ou grades, um controle de logon para adicionar segurana a seu site, e muito mais. Para obter mais informaes, consulte Controles de servidores Web do ASP.NET. Pgina e eventos de controle do servidor Um pgina da Web do ASP.NET e os controles dele oferecem suporte a um modelo de evento como os encontrados em Windows Forms. Por exemplo, quando os usurios clicar em um controle Button em um pgina da Web do ASP.NET, a pgina remetida de volta para o servidor, recriada, e um evento de clique criado. Voc pode adicionar cdigo para a pgina que responde a este evento de clique. A prpria pgina inicia eventos de ciclos de vida quando inicializada, como os eventos Page_Init e Page_Load, que oferecem a oportunidade de executar o cdigo quando a pgina inicializada (Lembre-se de que a pgina criada e reinicializada em cada round trip). Controles individuais podem iniciar seus prprios eventos. Controles de boto iniciam um evento Click, controles de boto de rdio e caixas de seleo iniciam um mtodo CheckedChanged, e caixa de listagem e controles de lista drop-down iniciam um evento SelectedIndexChanged. Alguns controles, tais como o controle Calendar, disparam eventos que so mais abstratos do que simples eventos de clique. Por exemplo, o controle Calendar dispara um evento VisibleMonthChanged quando usurios navegarem para um ms diferente.
Visual C# Consolidado
817
A maioria dos controles servidor ASP.NET suportam somente alguns dos eventos que voc pode tratar no cdigo servidor. Para processar um evento, a pgina deve executar uma round trip para que a escolha do usurio possa ser enviada para a pgina para processamento. Os controles do servidor no expe eventos de alta freqncia como onmouseover, porque sempre que esse evento iniciado, outra round trip para o servidor deve ocorrer, o que iria afetar consideravelmente o tempo de resposta na pgina. Entretanto, voc pode configurar controles de servidor ASP.NET para iniciar eventos do lado do cliente, como onmouseover. Nesse caso, os controles no iro ser remetidos novamente para o servidor, e voc criar um script de cliente para responder a eventos. Para obter mais informaes sobre como criar e usar eventos e manipuladores de eventos, consulte Tratamento de Evento de servidor em pginas da Web ASP.NET. Compatibilidade do navegador Como o processamento da pgina da Web do ASP.NET ocorre no servidor Web, pginas da Web ASP.NET so compatveis com qualquer navegador ou dispositivo mvel. Uma pgina da Web processa automatica e corretamente a marcao (XHTML ou outra linguagem de marcao) compatvel com o navegador para recursos, como estilos e layout. Como alternativa, voc pode criar pginas da Web com controles projetados especificamente para processar a sada para dispositivos especficos, como telefones celulares. Para obter mais informaes, consulte Criando Aplicativos da Web ASP.NET Mobile.
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.
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
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);
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
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,
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
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
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.
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
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.
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.
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.
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.
C#
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("output.xsl"); xslt.Transform("books.xml", "books.html");
Para compilar um folhas de estilo e usar um resolvedor com credenciais padro Visual C# Consolidado 835
C#
XslTransform xslt = new XslTransform(); XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; xslt.Load("sort.xsl", resolver);
C#
XslCompiledTransform xslt = new XslCompiledTransform(); XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; xslt.Load("sort.xsl", XsltSettings.Default, resolver);
C#
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("order.xsl"); // Create the XsltArgumentList. XsltArgumentList argList = new XsltArgumentList(); // Create a parameter which represents the current date and time. DateTime d = DateTime.Now; argList.AddParam("date", "", d.ToString()); // Create the XmlWriter. XmlWriter writer = XmlWriter.Create("output.xml", null); // Transform the file. xslt.Transform(new XPathDocument(filename), argList, writer);
C#
// Create the XsltSettings object with script enabled. XsltSettings settings = new XsltSettings(false,true); // Execute the transform. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("calc.xsl", settings, new XmlUrlResolver()); xslt.Transform("books.xml", "books.html");
Visual C# Consolidado
836
XML e carregar o arquivo XML para outro objeto. Cdigo usando a XslTransform classe. C#
// Execute the transformation. XslTransform xslt = new XslTransform(); xslt.Load("output.xsl"); XmlReader reader = xslt.Transform(new XPathDocument("books.xml"), null, new XmlUrlResolver()); // Load the results into a DOM object. XmlDocument doc = new XmlDocument(); doc.Load(reader);
C#
// Execute the transformation. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("output.xsl"); xslt.Transform("books.xml", "output.xml"); // Load the results into a DOM object. XmlDocument doc = new XmlDocument(); doc.Load("output.xml");
C#
// Execute the transformation. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("output.xsl"); MemoryStream ms = new MemoryStream(); xslt.Transform(new XPathDocument("books.xml"), null, ms); // Load the results into an XPathDocument object. ms.Seek(0, SeekOrigin.Begin); XPathDocument doc = new XPathDocument(ms);
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.
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
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
Funo uma API que fornece um modelo de estilo cursor para navegar em um armazenamento, juntamente com suporte a consultas XPath. Ele no fornece a edio de armazenamento subjacente. Para edio, use a XmlDocument classe. Ele uma interface que fornece um CreateNavigator mtodo para para o armazenamento. um XPathNavigator Ele permite edio do documento. Ele implementa IXPathNavigable, permitindo cenrios edio documento-onde transformaes XSLT so necessrias posteriormente. Para obter mais informaes, consulte Entrada XmlDocument para XslTransform.
IXPathNavigable XmlDocument
XmlDataDocument Ele derivado da XmlDocument. Ele Bridges o relacional e mundos XML por meio. Para otimizar o armazenamento de dados estruturados dentro do documento XML de acordo com mapeamentos especificados em um DataSet o DataSet Ele implementa IXPathNavigable, permitindo cenrios onde transformaes XSLT podem ser executadas sobre dados recuperados de um banco de dados relacionais. Para obter mais informaes, consulte Integrao XML com dados relacional e ADO.NET. XPathDocument Essa classe otimizada para XslTransform consultas XPath, processamento e e ele fornece um cache de alto desempenho somente leitura. Ele implementa IXPathNavigable e o armazenamento preferencial a ser usado para transformaes XSLT. Ele fornece navegao pela conjuntos de n XPath. Todos os mtodos de Seleo XPath no XPathNavigator retorno um XPathNodeIterator. Vrios XPathNodeIterator objetos podem ser criados sobre o mesmo armazenamento, que representa cada um conjunto de ns selecionado.
XPathNodeIterator
Extenses XSLT MSXML O msxsl:script e msxsl:node-set funes so as extenses XSLT Microsoft XML Core Services (MSXML) somente suporte para a XslTransform classe. Exemplo Cdigo o exemplo seguinte carrega um folha de estilo XSLT, l um arquivo denominado meusdados.xml em e executa uma transformao sobre os dados em um arquivo fictcio chamado myStyleSheet.xsl, enviar a sada formatada para o console. an XPathDocument, C#
using System; using System.IO; using System.Xml; using System.Xml.XPath; using System.Xml.Xsl; public class Sample { private const String filename = "mydata.xml"; private const String stylesheet = "myStyleSheet.xsl"; public static void Main() { XslTransform xslt = new XslTransform(); xslt.Load(stylesheet); XPathDocument xpathdocument = new XPathDocument(filename); XmlTextWriter writer = new XmlTextWriter(Console.Out); writer.Formatting=Formatting.Indented; xslt.Transform(xpathdocument, null, writer, null); } }
Visual C# Consolidado
840
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
Visual C# Consolidado
843
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;
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>
Visual C# Consolidado
847
A UnhandledAttributes propriedade fornece acesso a todos os atributos que no pertencem ao espao para nome do esquema. Esses atributos no so processados pelo processador de esquema. O exemplo de cdigo a seguir demonstra atravessando o esquema do cliente criada no tpico Criando esquemas XML. O exemplo de cdigo demonstra atravessando o esquema usando as colees descritas acima e grava todos os elementos e atributos no esquema no console. O exemplo traverses o esquema do cliente nas etapas a seguir. 1. Adiciona o esquema do cliente para um novo XmlSchemaSet objeto e ento compila ele. Quaisquer avisos de validao de esquema e erros encontrados ler ou Compilar o esquema so tratados pelo ValidationEventHandler delegado. Do XmlSchemaSet recupera o objeto compilado XmlSchema por Iterando sobre a Schemas propriedade. Como o esquema compilada, POST Schema--Compilation-InfoSet propriedades (PSCI) so acessveis. Itera por cada XmlSchemaElement na coleo Values do POST-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Elements gravar o nome de cada elemento para o console. Obtm o Customer elemento usando a XmlSchemaComplexType Classe de tipo complexo. Se o tipo complexo tem os atributos, obter e grava seu nome para o console. Para enumerar sobre cada XmlSchemaAttribute um IDictionaryEnumerator Obtm a partcula de seqncia do tipo complexo usando a XmlSchemaSequence classe. Itera por cada XmlSchemaElement na coleo System.Xml.Schema.XmlSchemaSequence.Items gravar o nome de cada elemento filho para o console.
2.
3.
4. 5. 6. 7.
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.
Visual C# Consolidado
849
2.
Do XmlSchemaSet recupera o objeto compilado XmlSchema por Iterando sobre a Schemas propriedade. Como o esquema compilada, POST Schema--Compilation-InfoSet propriedades (PSCI) so acessveis. Cria o PhoneNumber elemento usando a XmlSchemaElement classe, a xs:string restrio de tipo simples Usando. e XmlSchemaSimpleTypeRestriction classes, adiciona um aspecto padro propriedade Facets da restrio, e adiciona a restrio propriedade Content de tipo simples e o tipo simples para do elemento PhoneNumber o XmlSchemaSimpleType o SchemaType Itera por cada XmlSchemaElement na coleo Values do POST-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Elements. Do QualifiedName se do elemento "Customer", obtm o Customer elemento usando a XmlSchemaComplexType classe e a partcula de seqncia do tipo complexo usando a XmlSchemaSequence Classe de tipo complexo. Adiciona o novo PhoneNumber elemento seqncia contendo o existente FirstName e LastName elementos usando o Pre-Schema - coleo de compilao Items da seqncia. Finalmente, reprocesses e compila o objeto modificado XmlSchema Usando e grava-para o console. e Compile mtodos de classe XmlSchemaSet a Reprocess
3.
4. 5.
6. 7.
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); } }
2.
3. 4. 5. 6. 7. 8.
Observao Do System.Xml.Schema.XmlSchema.Items porque o FirstName elemento um elemento global no no esquema, no est disponvel em ou System.Xml.Schema.XmlSchema.Elements Colees. O exemplo de cdigo localiza o FirstName elemento, localizando o Customer elemento
Visual C# Consolidado
851
primeiro. O primeiro exemplo de cdigo traversed o esquema usando o POST-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Elements. Neste exemplo, o Pre-schema -. coleo de compilao System.Xml.Schema.XmlSchema.Items usada para atravessar o esquema Enquanto as duas colees fornecem acesso aos elementos globais no esquema, Iterando atravs da Items coleo mais demorada porque voc deve iterar sobre todos os elementos no esquema globais e ele no tem nenhuma propriedade PSCI. As colees PSCI (System.Xml.Schema.XmlSchema.Elements., System.Xml.Schema.XmlSchema.Attributes) fornecer acesso direto a seus elementos globais, atributos, e tipos e suas propriedades PSCI, System.Xml.Schema.XmlSchema.SchemaTypes, e assim por diante 1. Se cujos QualifiedName "Customer", obtm do elemento Customer usando a XmlSchemaComplexType classe e a partcula de seqncia do tipo complexo usando a XmlSchemaSequence classe tipo complexo. um elemento, o XmlSchemaObject Itera por cada XmlSchemaParticle no Pre-Schema - coleo de compilao System.Xml.Schema.XmlSchemaSequence.Items. Se que. um elemento, o QualifiedName "FirstName", define do elemento FirstName para o novo FirstName tipo complexo ao XmlSchemaParticleSchemaTypeName Finalmente, reprocesses e compila o objeto modificado XmlSchema Usando e grava-para o console. e Compile mtodos de classe XmlSchemaSet a Reprocess
2. 3. 4.
Visual C# Consolidado
852
Customer element // and the sequence particle of the complex type. if (schemaObject is XmlSchemaElement) { XmlSchemaElement element = schemaObject as XmlSchemaElement; if (element.QualifiedName.Name.Equals("Customer")) { XmlSchemaComplexType customerType = element.ElementSchemaType as XmlSchemaComplexType; XmlSchemaSequence sequence = customerType.Particle as XmlSchemaSequence; // Iterate over each XmlSchemaParticle in the pre-schemacompilation // Items property. foreach (XmlSchemaParticle particle in sequence.Items) { // If the XmlSchemaParticle is an element, who's QualifiedName // is "FirstName", set the SchemaTypeName of the FirstName element // to the new FirstName complex type. if (particle is XmlSchemaElement) { XmlSchemaElement childElement = particle as XmlSchemaElement; if (childElement.Name.Equals("FirstName")) { childElement.SchemaTypeName = new XmlQualifiedName("FirstNameComplexType", "http://www.tempuri.org"); } } } } } } // Reprocess and compile the modified XmlSchema object and write it to the console. schemaSet.Reprocess(customerSchema); schemaSet.Compile(); customerSchema.Write(Console.Out); } static void ValidationCallback(object sender, ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) Console.Write("WARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("ERROR: "); Console.WriteLine(args.Message); } }
Visual C# Consolidado
853
O exemplo de cdigo inclui o esquema de endereo nas etapas a seguir. 1. Adiciona o esquema do cliente e o esquema de endereo a um novo XmlSchemaSet objeto e ento compila-los. Quaisquer avisos de validao de esquema e erros encontrados ler ou compilar os esquemas so tratados pelo ValidationEventHandler delegado. Do XmlSchemaSet recupera os objetos compilados XmlSchema para esquemas tanto o cliente e endereo de por Iterando sobre a Schemas propriedade. Como os esquemas so compiladas, POST Schema--Compilation-InfoSet propriedades (PSCI) so acessveis. Cria um XmlSchemaImport objeto, define a Namespace Propriedade da importao ao espao para nome do esquema do endereo, define a Schema Propriedade da importao para o XmlSchema objeto do esquema de endereo, e adiciona a importao Includes propriedade do esquema do cliente. Reprocesses e compila o objeto modificado XmlSchema do esquema usando o do cliente e grava-para o console. e Compile mtodos de classe XmlSchemaSet a Reprocess Finalmente, recursivamente grava todos os os esquemas importadas para o esquema do cliente para o console usando a Includes propriedade do esquema do cliente. Do a Includes propriedade fornece acesso a todos inclui, importaes, ou redefines adicionado a um esquema.
2.
3.
4. 5.
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 />
A parte do documento XML estruturada pode ser mapeado para um DataSet, e ser eficiente armazenados, indexado, e pesquisados. Transformaes, validao e navegao pode ser feito com eficincia atravs de um modelo Cursor em vez dos dados XML que so armazenados relationally. s vezes, ele pode ser feito com mais eficincia em estruturas que se o XML ser armazenado em um XmlDocument modelo relacionais. O DataSet pode armazenar uma parte do XML. Isto , voc pode usar XPath ou XslTransform Para armazenar a. apenas os elementos e atributos de juros um DataSet A partir da, as alteraes podem ser feitas o subconjunto de dados, menores e filtrados com as alteraes propagando aos dados maiores no XmlDataDocument.
Visual C# Consolidado
855
Voc tambm pode executar uma transformao sobre os dados que foi carregados em do SQL Server. o DataSet Outra opo para vincular WinForm gerenciados classes-Estilo- .NET Framework e controles WebForm para uma DataSet que foi preenchido de um fluxo de entrada XML. Alm de suporte XslTransform, um XmlDataDocument Dados Relacionais expe para XPath consultas e validao. Basicamente, todos os servios XML esto disponveis sobre dados relacionais, e instalaes relacionais como vnculo de controle, CodeGen, e assim por diante, esto disponveis sobre uma projeo de XML estruturada sem comprometer fidelidade XML. Porque XmlDataDocument herdada de um XmlDocument, ele fornece uma implementao de DOM W3C. O fato de alguma forma. que associado a, e armazenar um subconjunto de seus dados em, um DataSet faz no restringir ou alterar seu uso como a XmlDataDocument uma XmlDocument Cdigo escrito para consumir um XmlDocument funciona inalterado contra um XmlDataDocument. O DataSet Fornece exibio relacional dos mesmos dados definindo tabelas, colunas, relaes, e restries, e um armazenamento de dados do usurio Autnomo, na memria. A ilustrao a seguir mostra as associaes diferentes que dados XML tem com e XmlDataDocument. o DataSet
A ilustrao mostra dados XML que podem ser carregados diretamente em que permite a manipulao direta com XML da maneira Relacional. a DataSet, Ou, o XML pode ser carregado em uma classe de DOM, que o XmlDataDocument, e posteriormente carregado e sincronizado com derivado o DataSet.. o DataSet Porque as alteraes feitas aos dados em um armazenamento de dados, so refletidas no outro armazenamento. e XmlDataDocument esto sincronizados em um nico conjunto a DataSet Do XmlDocument o XmlDataDocument herda todos os recursos de edio e navegao. H momentos ao usar. e seus recursos herdados, sincronizados com uma opo mais apropriada que carregar XML diretamente na XmlDataDocument a DataSet, o DataSet A tabela a seguir mostra os itens a serem considerados ao escolher o mtodo a ser usado para carregar o DataSet. Quando se carregar XML diretamente para um DataSet Quando se sincronizar um XmlDataDocument com um DataSet
Consultas de dados na DataSet so mais fcil com Consultas XPath so necessrias sobre os SQL que XPath. dados no DataSet. Preservao do elemento ordenao no cdigofonte XML no crtica. Espao em branco entre elementos e formatao no precise ser preservado no cdigo-fonte XML. Preservao do elemento ordenao no cdigo-fonte XML essencial. Espao em branco e formatao manuteno no cdigo-fonte XML crtica.
Visual C# Consolidado
856
Se carregar e gravar XML diretamente em e fora de um DataSet Endereos suas necessidades, consulte Carregar um DataSet de XML e Gravar um DataSet como dados XML. Do DataSet se carregando de um XmlDataDocument Endereos suas necessidades, consulte Sincronizando um Datasetwith um documento XML.
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.
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.
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);
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.
3.
4.
Voc pode restringir o acesso usando Evidence. O Evidence aplicada a base XmlResolver. usado para criar o PermissionSet que As XmlSecureResolver chamadas PermitOnly No criado PermissionSet antes de abrir os recursos. A lista a seguir resume alguns cenrios possveis e o tipo de prova para fornecer para cada cenrio.
Voc estiver trabalhando em um ambiente totalmente confiveis: Use seu conjunto para criar as provas. C#
Evidence myEvidence = this.GetType().Assembly.Evidence; XmlSecureResolver myResolver; myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);
Voc est trabalhando em um ambiente semiconfivel e voc tiver cdigo ou dados provenientes de uma fonte externa. Voc sabe a origem da fonte externa e tiver um URI que pode ser verificada: Use o URI para criar as provas. C#
Evidence myEvidence = XmlSecureResolver.CreateEvidenceForUrl(sourceURI); XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);
Voc esto trabalhando em um ambiente semiconfivel e voc tiver cdigo ou dados provenientes de uma fonte externa e voc no souber a origem da fonte externa: Definir o evidence Parmetro para null. Isso permite sem acesso aos recursos.
Visual C# Consolidado
859
OuSe seu aplicativo exigir alguns acesso aos recursos, solicitar evidncia do chamador. Use o XmlSecureResolver para resolver recursos XML A XmlUrlResolver classe o resolvedor padro para todas as classes no espao para nome System.Xml. usado para carregar documentos XML, e para resolver externos recursos, como entidades, DTDs ou esquemas, e importar ou incluir diretivas. Voc pode substitu-lo, especificando o XmlResolver objeto para utilizar. Especificando voc pode restringir os recursos que base XmlResolver pode acessar. an XmlSecureResolver, Para criar um objeto XmlReader que usa um XmlSecureResolver 1. 2. Criar Definir com a permisso correta. um XmlSecureResolver Criar um XmlReaderSettings objeto que usa o XmlSecureResolver objeto. C#
XmlReaderSettings settings = new XmlReaderSettings(); settings.XmlResolver = myResolver;
3.
Visual C# Consolidado
860
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.
Visual C# Consolidado
861
xs:ENTITY xs:float xs:gDay xs:gMonthDay xs:gYear xs:gYearMonth xs:hexBinary xs:ID xs:IDREF xs:IDREFS xs:int xs:integer xs:language xs:long xs:gMmonth xs:Name xs:NCName xs:negativeInteger xs:NMTOKEN xs:NMTOKENS xs:nonNegativeInteger xs:nonPositiveInteger xs:normalizedString xs:NOTATION xs:positiveInteger xs:QName xs:short xs:string xs:time xs:token xs:unsignedByte xs:unsignedInt xs:unsignedLong xs:unsignedShort
String Single DateTime DateTime DateTime DateTime Byte[] String String String[] Int32 Decimal String Int64 DateTime String String Decimal String String[] Decimal Decimal String XmlQualifiedName Decimal XmlQualifiedName Int16 String DateTime String Byte UInt32 UInt64 UInt16
Visual C# Consolidado
862
xdt:dayTimeDuration xdt:yearMonthDuration xdt:untypedAtomic xdt:anyAtomicType xs:anySimpleType N de documento N de elemento N de Atributo N NameSpace N texto N comentrio N de instruo de processamento
TimeSpan TimeSpan String Object String XPathNavigator XPathNavigator XPathNavigator XPathNavigator XPathNavigator XPathNavigator XPathNavigator
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: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
Visual C# Consolidado
864
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>
Visual C# Consolidado
865
Criar um XML Web Services Quando voc cria um XML Web Services, voc est criando um aplicativo que expe a funcionalidade para clientes XML Web Services. Acessar um XML Web Services Quando voc acessa um XML Web Services, seu aplicativo cliente localiza, referencia, e usa a funcionalidade contida em um XML Web Services separado. O cliente de um XML Web Services tipicamente um aplicativo que est apto a enviar, receber e processar mensagens para e oriundas de XML Web Services. Entretanto, o requisito mnimo que o cliente deve ser capaz de enviar mensagens para o XML Web Services. Isso inclui todos os aplicativos usando o .NET Framework.
Visual C# Consolidado
866
XML Web Services pode ser aplicativos autnomos ou subcomponentes de maior um aplicativo da Web. Por exemplo, suponha que voc estiver criando um aplicativo da Web que vende Livros online. Seu aplicativo da Web pode interagir com XML Web Services da seguinte forma:
Criando um XML Web Services Seu Aplicativo expe sua ordem processando a lgica como um XML Web Services, que seus Web sites afiliados podem usar em seus aplicativos da Web para vender livros atravs de seu armazenamento on-line sem exigir que seus clientes visitem seu site. Acessando um XML Web Service Seu Aplicativo acessa um XML Web Services fornecido por outra empresa on-line que especializada em escrever e fornecer revises de livros para vendedores de livros on-line. Quando um visitante da sua loja on-line v os detalhes de um livro especfico, eles tambm vem as revises desse livro na mesma pgina.
Lembre-se, XML Web Services podem ser acessados de praticamente qualquer outro tipo de aplicativo, incluindo outros XML Web Services, aplicativos de Web, aplicativos Windows, e aplicativos de console. O requisito mnimo que o cliente deve ser capaz de enviar mensagens para o XML Web Services.
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++.
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.
Visual C# Consolidado
872
2. 3. 4.
Adicionar uma referncia da Web para o XML Web Services com o qual seu aplicativo ir interagir. Para obter instrues, consulte Adicionando e Removendo Referncias da Web. Crie uma instncia do objeto do proxy em seu cdigo cliente onde voc deseja acessar o XML Web Services. Acesse os mtodos do XML Web Services como voc faria com qualquer outro componente. No cdigo de exemplo abaixo, o aplicativo cliente (Application1) est acessando um XML Web Services para o qual ele tem uma referncia da Web (Converter) que contm uma classe proxy (Service1), que possui um mtodo (ConvertTemperature) para chamar o XML Web Services. As duas linhas de cdigo em negrito representam o cdigo que necessrio para acessar o XML Web Services. C#
using System; namespace Application1 { class Class1 { static void Main() { Converter.Service1 cService = new Converter.Service1(); Console.WriteLine("Temperature in degrees Fahrenheit: "); double dFahrenheit = Convert.ToDouble(Console.ReadLine()); double dCelsius = cService.ConvertTemperature(dFahrenheit); Console.Write("Temperature in degrees Celsius: "); Console.WriteLine(dCelsius.ToString()); } } }
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.
Visual C# Consolidado
874
Por padro, um servio da Web criados com ASP.NET capaz de oferecem suporte a vrios protocolos, incluindo SOAP sobre HTTP e implementaes de HTTP-GET e HTTP-POST onde SOAP XML no- retornado em resposta. Para testar um servio da Web em um navegador usando HTTP-GET 1. 2. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte Publicao servio XML da Web e implantao. Acessar um navegador da Web e digite a URL para o servio da Web no endereo barra, usando o seguinte formato:
http://servername/apppath/webservicename.asmx
Value (Valor) O nome do servidor no qual o servio da Web foi implantado. O nome do seu diretrio virtual e o restante do caminho do aplicativo da Web.
webservicename.asmx O nome do arquivo.asmx Servio da Web. Por exemplo, suponha que voc ter publicado um servio da Web chamada StockServices. When published, the base URL for this service is http://<servername>/apppath/StockServices.asmx. You could test this service by entering this HTTP-GET request in the browser's address bar:
http://<servername>/apppath/StockServices.asmx
O servidor, em resposta a essa solicitao, exibe pgina Descrio HTML o servio da Web na. 3. Pgina Descrio HTML a servios da Web mostra todos os mtodos Servio da Web aos quais um servio da Web especfico. Vincular ao mtodo servio Web desejado e insira os parmetros necessrios para testar o mtodo e receber a resposta XML. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte Publicao servio XML da Web e implantao. Acessar um navegador da Web e digite o URL para o mtodo de servio da Web no endereo barra, usando este formato:
http://servername/vdir/webservicename.asmx/Methodname?parameter=value
Value (Valor) O nome do servidor no qual o servio da Web for implantado. O nome do seu diretrio virtual e o restante do caminho do aplicativo da Web.
Visual C# Consolidado
875
Methodname
O nome de um mtodo pblico que seja exposto pelo seu servio Web. Se deixar em branco, a Web pgina Descrio do servio no mostrada, listando cada mtodo pblico no arquivo.asmx disponveis. (Opcional) O parmetro apropriado nome e valor para qualquer parmetro exigido pelo seu mtodo. Se deixar em branco, a Web pgina Descrio do servio no mostrada, listando cada mtodo pblico no arquivo.asmx disponveis. (Opcional)
Parmetro
Observao O nome do mtodo Servio da Web nessa sintaxe diferencia maisculas e minsculas, mas no so o servidor, projeto, e nomes de servio da Web. Por exemplo, suponha que o StockServices Servio da Web do procedimento anterior contm um mtodo de servio da Web chamado GetQuote; o mtodo servio Web aceita um smbolo de aes como um parmetro, retornando o preo como um nmero de ponto flutuante de preciso dupla. Insira a solicitao HTTP-GET a seguir na barra Endereos do navegador para testar esse mtodo: http://<servername>/apppath/StockServices.asmx/GetStockQuote?tickerName=MSFT 3. O servidor envia uma resposta contendo um documento XML, que exibida no navegador. Por exemplo GetQuote, o XML tem o preo atual de aes voc solicitar. O resultado pode aspecto como o seguinte:
<?xml version="1.0" ?> <double>74.5</double>
Para testar um servio da Web em um navegador usando HTTP-POST 1. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte Publicao servio XML da Web e implantao. Este procedimento usa o seguinte servio da Web implantado como um math.asmx arquivo que seja acessvel a partir da raiz virtual de um http://www.contoso.com Site, como um exemplo: C#
<%@ WebService Language="C#" Class="Math" %> using System.Web.Services; public class Math : WebService { [ WebMethod ] public int Add(int num1, int num2) { return num1+num2; } [ WebMethod ] public int Subtract(int num1, int num2) { return num1-num2; } }
Visual Basic
<%@ WebService Language="VB" Class="Math" %> Imports System.Web.Services Public Class Math Inherits WebService <WebMethod> _ Public Function Add(num1 As Integer, num2 As Integer) As Integer Return num1 + num2 End Function <WebMethod> _ Public Function Subtract(num1 As Integer, num2 As Integer) As Integer Return num1 - num2 End Function End Class
2.
Crie uma pgina HTML com um formulrio que tenha o method atributo definido como POST. Use o seguinte formato:
<form method=POST action='http://www.contoso.com/math.asmx/Subtract'> <input type="text" size="5" name='num1'\"></td> - <input type="text" size="5" name='num2'\"></td> = <input type=submit value="Subtract"> </td> </form>
Visual C# Consolidado
876
Parmetro Mtodo
Value (Valor) POST Se voc desejar para testar seu servio da Web usando HTTP-POST, use POST. URL para o mtodo de servio da Web. No exemplo anterior, math.asmx o servio da Web e Subtract o mtodo Servio da Web.
AO
Tipo ="text" Para cada parmetro do mtodo Servio da Web, criar input marcas com o atributo Tipo definido como "text". Isso permite que voc para digitar um valor de parmetro em Controle de entrada de texto. Nome ='num1' O nome do parmetro mtodo Servio da Web. Adicionar quantos controles de entrada de texto no formulrio pois h parmetros no mtodo de servio da Web. Por exemplo, se um mtodo de servio da Web tiver trs parmetros, trs controles de entrada de texto so necessrias que cada ter seu name atributo definido como o nome do parmetro. Adicionar um boto Enviar para voc pode enviar os dados de volta para o mtodo servio Web.
Tipo = enviar 3.
Acessar um navegador da Web e digite o URL para o documento HTML criado na etapa anterior. O documento HTML criado na etapa anterior exibido. Insira os valores apropriados para o mtodo de servio da Web nas caixas de texto e clique no submit boto. Por exemplo, e 3 se voc inseriu 6 para as caixas dois texto para mtodo Servio da Web o exemplo na Subtract, o seguinte resultado retornado:
<?xml version="1.0" ?> <int xmlns="http://tempuri.org/">3</int>
4.
Consulte tambm
Visual C# Consolidado
877
Na campo Endereo do navegador, digite o URL bsico para o XML Web Service usando este formato:
http://servername/projectname/xmlwebservicename.asmx
Valor O servidor no qual o XML Web Service est instalado. Nome do projeto do seu XML Web Service e quaisquer informaes adicionais de diretrio necessrias para acessar o arquivo.asmx para seu XML Web Service.
webservicename.asmx O nome do arquivo.asmx para o XML Web Service. Por exemplo, para acessar um XML Web Service chamado Service1.asmx, que faz parte de um projeto chamado WebService1 em sua mquina local, voc deve digitar o seguinte:
http://localhost/XmlWebService1/Service1.asmx
A pgina de ajuda de servio do mtodo fornece informaes adicionais relacionadas quele mtodo de XML Web Service especfico. A pgina fornece a possibilidade de chamar o mtodo usando o protocolo HTTP-POST. O mtodo XML Web Service, no entanto, deve suportar o protocolo HTTP-POST para ativar essa funcionalidade. Na parte inferior da pgina, a pgina de ajuda de servio do mtodo fornece exemplos de mensagens de solicitao e resposta para os protocolos que o mtodo XML Web Service suporta. Descrio do Servio A pgina de ajuda de servio tambm fornece um link para a descrio de servio do XML Web Service, que uma definio formal dos recursos do XML Web Service. A descrio de servio um documento que usa a gramtica WSDL (Web Services Description Language) (WSDL). A descrio de servio define o contrato para os formatos das mensagens que os clientes precisam seguir para trocar mensagens com o XML Web Service. Para obter mais informaes, consulte Descrio do XML Web Service. Acessar a descrio de servio
No campo Endereo do navegador, digite o URL bsico para o XML Web Service e fornea a seqncia de caracteres de consulta WSDL utilizando este formato:
http://servername/projectname/xmlwebservicename.asmx?WSDL
Valor O servidor no qual o XML Web Service est instalado. Nome do projeto do seu XML Web Service e quaisquer informaes adicionais de diretrio necessrias para acessar o arquivo.asmx para seu XML Web Service.
Visual C# Consolidado
878
webservicename.asmx O nome do arquivo.asmx para o XML Web Service. Por exemplo, para acessar a descrio de servio de um XML Web Service chamado Service1.asmx, que faz parte de um projeto chamado WebService1 em sua mquina local, voc deve digitar o seguinte:
http://localhost/XmlWebService1/Service1.asmx?WSDL
Acessando XML Web Services de um navegador da Web Voc pode acessar um XML Web Service que oferea suporte ao protocolo HTTP-GET em um navegador da Web. Por padro, os XML Web Services que voc cria no Visual Studio, usando o modelo de projeto de Web Service ASP.NET, suportam HTTP-GET, HTTP-POST, e HTTP-SOAP. Nem todos os protocolos podem oferecer suporte a todos os mtodos. Em geral, os protocolos HTTP-GET e HTTP-POST so mais restritos que o HTTP-SOAP, em relao aos tipos de dados que eles suportam.
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&...¶meternamen=valuen
Valor O servidor no qual o XML Web Service est instalado Nome do projeto do seu XML Web Service e quaisquer informaes adicionais de diretrio necessrias para acessar o arquivo.asmx para seu XML Web Service.
webservicename.asmx O nome do arquivo.asmx para o XML Web Service. methodname O nome do mtodo Web com diferenciao de letras maisculas de minsculas. Os nomes dos parmetros do mtodo da Web. Os valores codificados da URL de cada um dos parmetros do mtodo da Web.
parametername Valor
Por exemplo, para acessar o mtodo ReturnThisString de um XML Web Service chamado Service1.asmx, com um parmetro chamado MyString definido com o valor de "This is my test String", e que parte de um projeto chamado WebService1 na sua mquina local, voc deve digitar o seguinte:
http://localhost/XmlWebService1/Service1.asmx/ReturnThisString?MyString=This+is+my+test+string
Consulte tambm
Visual C# Consolidado
879
4.
O Visual Studio cria automaticamente os arquivos necessrios e referncias para suporte um XML Web Services . Quando concludo, a IDE exibe o arquivo cdigo de servio no modo de exibio de cdigo. Para obter mais informaes, consulte ASP.NET XML Web Service Basics. Consulte tambm
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. }
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
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.
BufferResponse
Visual C# Consolidado
881
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.
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.
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
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.
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
A mensagem de solicitao SOAP para o mtodo que adiciona doubles, AddDoubles, ser semelhante a seguir:
POST /myWebService/Service1.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/AddDoubles" <?xml version="1.0"
Visual C# Consolidado
883
encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <AddDoubles xmlns="http://tempuri.org/"> <dValueOne>double</dValueOne> <dValueTwo>double</dValueTwo> </AddDoubles> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length
A mensagem de resposta SOAP para o mtodo que adiciona doubles, AddDoubles, ser semelhante a seguir:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <AddDoublesResponse xmlns="http://tempuri.org/"> <AddDoublesResult>double</AddDoublesResult> </AddDoublesResponse> </soap:Body> </soap:Envelope>
TransactionOption A propriedade TransactionOption do atributo WebMethod permite o mtodo de XML Web Service participar como o objeto raiz de uma transao. Apesar de voc poder definir a propriedade TransactionOption para qualquer valor da enumerao TransactionOption, um mtodo de XML Web service s possui dois comportamentos possveis; ele no participa de uma transao (Disabled, NotSupported, Supported), ou ele cria uma nova transao (Required, RequiresNew). A menos que seja especificado em contrrio, o valor padro TransactionOption.Disabled. Para obter mais informaes, consulte Propriedade WebMethodAttribute.TransactionOption. Alm dos pr-requisitos para qualquer mtodo de XML Web Service, voc tem de adicionar uma referncia para System.EnterpriseServices.dll. Este namespace contm mtodos e propriedades que expem o modelo de transao distribuda encontrado no servios COM+ . A classe System.EnterpriseServices.ContextUtil permite voc votar na transao usando os mtodos SetComplete ou SetAbort. Para obter mais informaes, consulte Participando de transaes nos XML Web Services criados com ASP.NET e Transaes automticas e XML Web Services. Criando uma nova transao com um mtodo de XML Web Service 1. 2. Adicione uma referncia para System.EnterpriseServices.dll. Para obter mais informaes, consulte Adicionando e removendo referncias. Adicione o namespace System.EnterpriseServices ao XML Web Service, como mostrado abaixo: C#
using System.EnterpriseServices;
3.
Visual C# Consolidado
884
Sem o depurador
Exibir no navegador
Compilar e executar um XML Web Service com o depurador 1. 2. 3. No Solution Explorer, clique com o boto direito do mouse no arquivo .asmx do XML Web Service que voc deseja executar, e clique Set As Start Page no menu de atalho. No menu Debug, clique em Start. Este comando instrui o Visual Studio a executar o XML Web Service no depurador. Para interromper a execuo do formulrio e retornar ao Code Editor, feche o navegador, ou clique em Stop Debugging no menuDebug. No Solution Explorer, clique com o boto direito do mouse no arquivo.asmx do XML Web Service que voc deseja executar, e clique Set As Start Page no menu de atalho. No menu Debug, clique em Start Without Debugging. O Visual Studio salva todos os arquivos no projeto e os compila. Uma vez compilados, o Visual Studio inicia o navegador padro e navega para a pgina inicial do projeto. 3. Para interromper a execuo do XML Web Service e retornar ao Code Editor, feche o navegador. No Solution Explorer, clique com o boto direito do mouse no arquivo.asmx do XML Web Service que voc deseja executar, e clique em View in Browser no menu de atalho.
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.
Uma pgina de entrada de XML Web Services denominada Service.asmx. Um arquivo de cdigo nomeado Service.vb (ou .cs).
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.
Visual C# Consolidado
886
3. 4. 5. 6.
Clique no cone ao lado da caixa suspensa Connect to: para abrir a caixa de dilogo Open Web Site. Na caixa Open Web Site, selecione a localidade para a qual voc deseja copiar o projeto. Usando os cones de seta, selecione arquivos do site da Web de origem para copi-los para o site da Web remoto. Clique em Copy Web Site para copiar o site da Web.
Aps implantar seu XML Web Services, voc precisa levar em considerao como tornar possvel que desenvolvedores o localizem, caso voc pretenda que outras pessoas o usem. Para obter mais informaes, consulte How to: Enable Discovery for XML Web Services.
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.
Visual C# Consolidado
887
acessvel para compilar a classe proxy em montagem para o aplicativo Console. Como alternativa, a classe proxy podem ser compilado em um conjunto e implantado onde o aplicativo Console possam acess-lo. Para criar um aplicativo cliente console Servio da Web 1. Criar um proxy para o servio da Web. C#
Wsdl http://www.contoso.com/Counter.asmx?WSDL
Para obter mais informaes, consulte Criando um proxy de servio da Web XML. 2. 3. Criar um aplicativo de console. Criar uma instncia da classe proxy em seu cdigo do cliente. C#
Counter myCounter = new Counter();
4.
Chame o mtodo da classe proxy que se comunica com o mtodo de servio da Web. C#
UsageCount = counter.ServiceUsage();
5.
Compilar o aplicativo Console em um executvel. No exemplo a seguir, o aplicativo Console foi salvo como UsageMonitor. C#
csc /t:exe /r:System.Web.dll,System.XML.dll,System.Web.Services.dll UsageMonitor.cs Counter.cs
Exemplo C#
using System; class UsageMonitor { public static void Main(string[] args) { int UsageCount; // Create an instance of the Web service class. Counter myCounter = new Counter(); // Call the Web service method ServiceUsage. UsageCount = myCounter.ServiceUsage(); // Output the results to the console. if (UsageCount == 1) Console.WriteLine("Web service has been utilized >" + UsageCount.ToString() + "< time."); else Console.WriteLine("Web service has been utilized >" + UsageCount.ToString() + "< times."); } }
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>
2.
3.
Chamar o mtodo Begin, passando o funo callback como o segundo argumento e um objeto fornecendo estado (no neste exemplo, a implementao do cliente do PrimeFactorizer) como o terceiro argumento. C#
IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf);
4. 5.
Verifique a propriedade IsCompleted em retornado pelo mtodo Begin. o IAsyncResult O valor definido como true Depois o cliente tem recebeu uma resposta de um servidor. Dentro do funo callback, acessar o objeto estado. O IAsyncState parmetro na propriedade AsyncState possui o objeto passado como o terceiro parmetro para o Begin mtodo. C#
PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState;
6.
Dentro do funo callback, chame o mtodo final sobre o objeto estado obtidos na etapa anterior.
Visual C# Consolidado
889
C#
long[] results = pf.EndFactorize(ar);
Exemplo C#
using System; using System.Runtime.Remoting.Messaging; using MyFactorize; class TestCallback { public static void Main(){ long factorizableNum = 12345; PrimeFactorizer pf = new PrimeFactorizer(); //Instantiate an AsyncCallback delegate to use as a parameter //in the BeginFactorize method. AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback); // Begin the Async call to Factorize, passing in our // AsyncCalback delegate and a reference // to our instance of PrimeFactorizer. IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf); // Keep track of the time it takes to complete the async call // as the call proceeds. int start = DateTime.Now.Second; int currentSecond = start; while (!ar.IsCompleted){ if (currentSecond < DateTime.Now.Second) { currentSecond = DateTime.Now.Second; Console.WriteLine("Seconds Elapsed..." + (currentSecond - start).ToString() ); } } // Once the call has completed, you need a method to ensure the // thread executing this Main function // doesn't complete prior to the call-back function completing. Console.Write("Press Enter to quit"); int quitchar = Console.Read(); } // Set up a call-back function that is invoked by the proxy class // when the asynchronous operation completes. public static void FactorizeCallback(IAsyncResult ar) { // You passed in our instance of PrimeFactorizer in the third // parameter to BeginFactorize, which is accessible in the // AsyncState property. PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState; long[] results; // Get the completed results. results = pf.EndFactorize(ar); //Output the results. Console.Write("12345 factors into: "); int j; for (j = 0; j<results.Length;j++){ if (j == results.Length - 1) Console.WriteLine(results[j]); else Console.Write(results[j] + ", "); } } }
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.
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.
Visual C# Consolidado
892
& "/" & SvcName & "/Service1.asmx" FoundIt = True End If End If Next Node If Not FoundIt Then Throw New InstallException("Config file did not contain a ServerName section") End If ' Writes out the new config file. XmlDocument.Save(FileInfo.FullName) Finally installlog.WriteLine("Ending edit of config file") installlog.Close() End Try End Sub
O cdigo acima primeiro cria um arquivo de log de instalao que ir gravar o andamento de uma ao personalizada. O namespace System.Reflection usado para localizar o assembly que est sendo instalado e para localizar o arquivo .config associado. O modelo de documento do XML usado para fazer uma iterao atravs do arquivo .config at a seo appSettings ser localizada. Quando a chave servername.service for encontrada, seu valor associado alterado para incluir os parmetros que foram passados, redirecionando o aplicativo para usar o novo XML Web Services. 5. 6. No Solution Explorer, clique duas vezes no arquivo Web.config para abr-lo. Copie o valor da chave para seu XML Web Services na seo appSettings . A chave assume a forma servername.service onde servername o servidor onde o XML Web Services est localizado, e service o nome do XML Web Services. Abra o mdulo de classe Installer no editor de cdigos e substitua o texto "ServerName.Service" com o valor que voc copiou na etapa anterior. Adicione um projeto de instalao da Web Projetos de instalao so usados para criar um instalador para o aplicativo. Baseados na tecnologia do Windows Installer, projetos de instalao incluem recursos como a capacidade para executar aes personalizadas durante a instalao e para personalizar a interface do usurio de instalao. Para obter mais informaes sobre projetos de instalao, consulte Implantando aplicativos e componentes.
7.
Visual C# Consolidado
893
Visual C# Consolidado
894
Edit2Label Edit2Value
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.
No menu Build, escolha Build Projectname, onde Projectname o nome do seu projeto de instalao.
2. 3.
Visual C# Consolidado
895
personalizado, como o uso de cabealhos SOAP. Alm disso, o ASP.NET oferece a capacidade, conhecida como representao, para executar uma solicitao usando as credenciais do cliente. Para obter mais informaes sobre como usar a representao, consulte Representao ASP.NET. Este tpico resume as opes disponveis para servios da Web criados com ASP.NET autenticao e autorizao. Para obter mais informaes sobre opes de segurana disponveis para aplicativos da Web ASP.NET, consulte Proteger Aplicativos da Web ASP.NET Como Criando aplicativos ASP.NET seguros: autenticao, autorizao e comunicao seguraSegurana de aplicativos da Web ASP.NET. Para obter mais informaes sobre como acessar recursos remotos de aplicativos-baseado em ASP.NET, consulte os tpicos " modelo Impersonation / Delegation " e confiveis modelo subsistema " " no captulo 3 de Criando aplicativos ASP.NET Seguros. Opes de autenticao para servios XML da Web Servios da Web criados com ASP.NET tem vrias opes para autenticar clientes, portanto, a pergunta grande: qual um for da direita para um servio da Web especfico? Para escolher a opo Segurana direita, uma das coisas para escolher entre um desenvolvedor tem o nvel de segurana e desempenho. Para alguns servios da Web, essencial que credenciais cliente so enviados atravs da rede usando criptografia, portanto, um algoritmo que criptografa as credenciais do cliente essencial. Por exemplo, um desenvolvedor gravar um servio da Web que processa cartes de crdito provavelmente worries mais sobre as credenciais do cliente seja roubado que a sobrecarga extra de criptografar os dados de carto de crdito. A tabela a seguir um resumo das opes de autenticao disponveis para servios da Web criado com o ASP.NET. Opes prefixo com o Windows so uma parte das opes de autenticao Windows disponveis para servios da Web criados com ASP.NET. Resumo das opes de autenticao Opo de autenticao Windows-Basic
Descrio Use para identificao no seguros de clientes, como o nome de usurio e senha so enviados em Base seqncias codificado 64-em texto sem formatao. Senhas e nomes de usurio so codificado, mas no criptografados, neste tipo de autenticao. Um usurio determinado, malintencionado equipado com uma ferramenta monitoramento de rede-pode interceptar nomes de usurio e senhas.
Windows-Basic via Use para identificao dos clientes em cenrios de Internet seguros. O nome SSL de usurio e senha so enviados atravs da rede usando criptografia Layer (SSL) soquetes Segurana, em vez de texto sem formatao. Este relativamente fcil para configurar e funciona para cenrios de Internet. No entanto, usando SSL diminui o desempenho. Windows-Digest Use para identificao dos clientes em cenrios de Internet seguros. Desmarque usa hash para transmitir credenciais cliente de uma maneira criptografado para a senha no so transmitidos em texto. Alm disso, autenticao Digest pode trabalhar atravs de servidores proxy. No entanto, ele suporte em outras plataformas no amplamente.
Visual C# Consolidado
896
Usa NTLM ou Kerberos. Usa uma troca criptogrfica com navegador da Web Microsoft Internet Explorer do usurio.
Usar para identificao dos clientes na Internet e intranet seguras cenrios. Requer cada cliente para obter um certificado de um autoridade de certificao mutuamente confivel. Certificados opcionalmente so mapeados para contas de usurio, que so usadas pelo IIS para autorizar acesso ao servio da Web. No suporte para servios da Web. Isso um sistema pelo qual as solicitaes no autenticadas so redirecionadas para um formulrio HTML utilizando o redirecionamento do lado do cliente HTTP. A maioria dos clientes de servios da Web no ser deseja fornecer credenciais usando uma interface; voc deve resolver isso se voc desejar usar a autenticao de formulrios. til para cenrios de Internet seguros e no seguras. Credenciais de usurio so passados no cabealho SOAP da mensagem SOAP. O servidor Web, independentemente da plataforma que hospeda o servio da Web, fornece uma implementao de autenticao personalizado.
Formulrios
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
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
3. 4. 5.
Para instalar os bancos de dados de exemplo Northwind e Pubs para o SQL Server 1. 2.
3. 4. 5.
Para instalar os bancos de dados de exemplo Adventure Works para o SQL Server 2000 1. 2.
3. 4.
Visual C# Consolidado
900
5.
Depois de descarregar o arquivo, clique duas vezes no arquivo Nwind.exe para instalar o banco de dados. No Windows, abra o Internet Explorer. Navegue at a seguinte URL: http://www.microsoft.com/downloads (Microsoft Download Center) No campo Keywords, digite SQL Server Express. Clique em Go. Na pgina de resultados, siga o link para a pgina de download do SQL Server Express e siga as instrues.
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
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
Visual C# Consolidado
901
No menu Data, clique em Show Data Sources. Na janela Data Sources, clique em Add New Data Source para iniciar o assistente Data Source Configuration. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista suspensa, selecione-a. OuSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela Data Sources. Criando controles para exibir dados da tabela de Clientes
5. 6. 7. 8.
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
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.
Visual C# Consolidado
903
Em algumas situaes, talvez seja conveniente criar um objeto de conexo sem a assistncia de qualquer ferramentas de design de dados. Para informaes sobre como criar conexes programaticamente, consulte Connecting to Data Sources. Observao Para obter informaes sobre como conectar aplicativos da Web a dados, consulte Acessando dados com o ASP.NET. Criando conexes Ao usar Visual Studio, conexes so configuradas usando o Add/Modify Connection Dialog Box (General). A caixa de dilogoAdd Connection aparece quando voc est editando ou criando conexes dentro de um dos assistentes de dados ou doServer Explorer / Database Explorer ou quando voc estiver editando propriedades de conexo na janela Properties Conexes de dados so automaticamente configuradas quando voc executa uma das seguintes aes: Ao Descrio
Execuo do Assistente para Conexes so configuradas quando o caminho do banco de dados Configurao da Fonte de escolhido no Data Source Configuration Wizard. Para obter Dados. mais informaes, consulte Como: Conectar-se a Dados em um Banco de Dados.
Visual C# Consolidado
904
Execuo do Assistente de Configurao para o TableAdapter. Execuo do Assistente de configurao da consulta TableAdapter. Arraste de itens da Janela de fontes de dados para um formulrio ou o Component Designer
Conexes so criadas dentro do TableAdapter Configuration Wizard. Para obter mais informaes, consulte Como: Criar TableAdapters. Conexes so criadas dentro do TableAdapter Query Configuration Wizard. Para obter mais informaes, consulte Como: Criar Consultas TableAdapter:. Objetos de conexo so criados quando voc arrasta itens da janela Data Sources para o Windows Forms Designer ou para o Component Designer. Para obter mais informaes, consulte Exibir dados em formulrios em aplicativos do Windows.
Adio de novas conexes Conexes de dados no Server Explorer/Database Explorer de dados para oServer aparecem na lista de conexes disponveis dentro dos assistentes Explorer / Database Explorer. de dados. Para obter mais informaes, consulte Como: adicionar novas conexes de dados no Server Explorer/Database Explorer. Seqncias de Caracteres de Conexo Todos os objetos de conexo expoem aproximadamente os mesmos participantes. Entretanto, os membros especficos disponveis em um determinado objeto OleDbConnection dependem de qual fonte de dados ele est conectado a; nem todas as fontes de dados suportam todos os membros da classe OleDbConnection. A propriedade Primria associada a um objeto de conexo a propriedadeConnectionString. Esta propriedade consiste em uma seqncia de caracteres com pares de informaes de atributo / valor necessrios para fazer logon em um servidor de banco de dados e apontam para um banco de dados especfico. Uma propriedade ConnectionStringtpica pode parecer com o seguinte:
Provider=SQLOLEDB.1;Data Source=MySQLServer;Initial Catalog=NORTHWIND;Integrated Security=SSPI
Essa seqncia de caracteres de conexo particular especifica que a conexo deve usar a segurana integrada do Windows. Em vez disso uma seqncia de caracteres de conexo pode incluir um nome de usurio e senha, mas isso no recomendvel, pois esses atributos depois sero compilados em seu aplicativo representando portanto uma possvel violao de segurana. Observao de segurana O armazenamento de detalhes em seqncias de caracteres de conexo (como uma senha) podem afetar a segurana do seu aplicativo. Utilizar a segurana integrada do Windows uma maneira mais segura para controlar o acesso a um banco de dados. Para obter mais informaes, consulte Securing Connection Strings. Os pares de atributo / valor mais comuns usados pelo OLE DB tambm so representados separadamente por uma propriedade individual, como DataSourcee Database. Ao trabalhar com um objeto de conexo, voc pode definir a propriedade ConnectionString como uma nica seqncia de caracteres, ou voc pode definir propriedades de conexo individuais. (Se sua fonte de dados exigir valores seqncia de caracteres de conexo que no so representados por propriedades individuais, ento voc deve definir a propriedade ConnectionString.)
Visual C# Consolidado
905
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.
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
Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o Projeto
Visual C# Consolidado
908
3. 4. 5.
o
Clique em Next na pgina bem-vindo Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type. Na pgina Choose your Data Connection, siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista suspensa, selecione-a. -ouSelecione New Connection para configurar uma nova conexo de dados. Para obter mais informaes, consulte Como: Criar Conexes com Bancos de Dados do Access, ou Como: Criar conexes com bancos de dados SQL Server. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais (include sensitive data), e clique em Next. Clique em Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique em Finish. O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela Data Sources.
6. 7. 8. 9.
3. 4. 5. 6. 7.
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
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.
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.
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
Visual C# Consolidado
910
8. 9.
Selecione itens na janela Data Sources e arraste-os para um formulrio. Para obter mais informaes, consulte Viso Geral da Exibio dados.
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
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
7. 8. 9.
Visual C# Consolidado
912
10. Selecione as tabelas Customers e Orders, e clique em Finish. O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela Data Sources. Segurana Armazenar informaes confidenciais (como uma senha) pode afetar a segurana do seu aplicativo. Usar a Windows Authentication (tambm conhecida como segurana integrada) uma maneira mais segura para controlar o acesso a um banco de dados. Para obter mais informaes, consulte Securing Connection Strings. Prximas etapas O dataset que voc acabou de criar agora est disponvel na janela Data Sources.
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.
Visual C# Consolidado
913
5.
Arraste itens da guia DataSet da Toolbox no designer. Para obter mais informaes, consulte Como editar um DataSet:. -ouArraste itens de uma conexo ativa em Server Explorer / Database Explorer para o Dataset Designer.
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
1. 2. 3.
No menu Project, clique em Add New Item. A caixa de dilogo Add New Item aparece. Na caixa Templates da caixa de dilogo Add New Item, clique em DataSet. Nomeie o dataset como NorthwindDataset, e clique Add. O Visual Studio adicionar um arquivo chamado NorthwindDataset.xsd ao projeto e ir abri-lo no Dataset Designer. Criando uma Conexo de Dados no Server Explorer
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.
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
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.
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
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
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
Agora que voc criou a tabela, voc pode desejar executar uma das seguintes aes: Para Criar um formulrio para entrada de dados Adicionar dados tabela Visualizar dados em uma tabela Editar dados Consulte Passo-a-passo: Exibindo dados em um formulrio em um aplicativo do Windows. Adding Data to a Table. Viewing Data in a Table. Editing Data in a Table
Visual C# Consolidado
917
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
Visual C# Consolidado
918
Visual C# Consolidado
919
Agora que voc criou as tabelas relacionadas, voc pode desejar executar uma das seguintes aes: Para Adicionar dados tabela Consulte Adding Data to a Table
Visual C# Consolidado
920
Visualizar dados em uma tabela Editar dados Excluir uma linha de uma tabela
Viewing Data in a Table Editing Data in a Table Deleting a Row from a Table
Visual C# Consolidado
921
Esquema associado a DataTable Ao criar um TableAdapter, a consulta inicial ou o procedimento armazenado usado para definir o esquema da DataTable associada ao TableAdapter. Voc executa essa consulta inicial ou procedimento armazenado chamando o mtodo principal Fill do TableAdapter (que preenche a DataTable associada ao TableAdapter). Quaisquer alteraes feitas consulta principal do TableAdapter so refletidas no esquema da tabela de dados associada. Por exemplo, remover uma coluna da consulta principal remove a coluna da tabela de dados associada. Se quaisquer consultas adicionais do TableAdapter usarem instrues SQL retornando colunas que no esto na consulta principal, ento o designer tentar sincronizar as alteraes de coluna da consulta principal e quaisquer consultas adicionais. Para obter mais informaes, consulte Como editar TableAdapters:. Comandos UPDATE do TableAdapter A funcionalidade de atualizao de um TableAdapter depende de quanta informao est disponvel com base na consulta principal fornecida no TableAdapter Wizard. Por exemplo, TableAdapters que estejam configurados para buscar valores de vrias tabelas (JOINs), valores escalares, ou de resultados de funes agregadas, no so criados inicialmente com a capacidade de enviar atualizaes de volta para o banco de dados subjacente. Entretanto, voc pode configurar os comandos INSERT, UPDATE e DELETE manualmente na janela Properties. Consultas do TableAdapter
Diferentemente dos adaptadores de dados padro, os TableAdapters podem conter consultas mltiplas para preencher suas tabelas de dados associadas. Voc pode definir tantas consultas para um TableAdapter quanto seu aplicativo precisar, desde que cada consulta retorne os dados de acordo com o mesmo esquema da sua tabela de dados associada. Isso permite o carregamento de dados que satisfaam critrios diferentes. Por exemplo, se seu aplicativo
Visual C# Consolidado
922
contiver uma tabela de clientes, voc pode criar uma consulta que preenche a tabela com cada cliente cujo nome comea com uma certa letra, e outra consulta que preenche a tabela com todos os clientes localizados no mesmo estado. Para preencher uma tabela Customers com clientes em um estado determinado voc pode criar uma consulta FillByState que leva um parmetro para o valor de estado: SELECT * FROM Customers WHERE State = @State. Voc executa a consulta chamando o mtodo FillByState e passando o valor do parmetro como este: CustomerTableAdapter.FillByState("WA"). Para obter mais informaes, consulte Como: Criar Consultas TableAdapter:. Alm das consultas que retornam dados no mesmo esquema da tabela de dados do TableAdapter, voc pode adicionar consultas que retornam valores escalares. Por exemplo, criar uma consulta que retorna uma contagem de clientes de um CustomersTableAdapter. (SELECT Count(*) From Customers) vlido, apesar de os dados retornados no estarem de acordo com esquema da tabela. Propriedade ClearBeforeFill O TableAdapter adiciona uma propriedade no disponvel na classe base DataAdapter. Por padro, sempre que voc executar uma consulta para preencher uma tabela de dados do TableAdapter, os dados sero limpos e somente os resultados da consulta so carregados na tabela. Defina a propriedade ClearBeforeFill do TableAdapter como false se voc deseja adicionar ou mesclar os dados retornados de uma consulta com os dados existentes na tabela de dados. Independentemente de voc limpar os dados, voc precisar explicitamente enviar as atualizaes de volta ao banco de dados, se desejar. Portanto lembre-se de salvar quaisquer alteraes feitas nos dados da tabela antes de executar outra consulta que preencha a tabela. Para obter mais informaes, consulte Como: atualizar dados usando um TableAdapter. Herana do TableAdapter Os TableAdapters estendem a funcionalidade dos adaptadores padro de dados, encapsulando um DataAdapter configurado. Por padro, o TableAdapter herda de Component e no pode ser convertido (casting) para a classe DataAdapter. Converter um TableAdapter para um DataAdapter resulta em uma InvalidCastException. Para alterar a classe base de um TableAdapter, voc pode digitar uma classe que deriva do Component na propriedade Base Class do TableAdapter no Dataset Designer. Mtodos e propriedades do TableAdapter A classe TableAdapter no parte do .NET Framework, assim voc no pode pesquisar ele na documentao ou no Object Browser. Ele criado no tempo de design quando voc usa um dos assistentes mencionados acima. O nome atribudo a um TableAdapter quando voc o cria baseado no nome da tabela com a qual voc estiver trabalhando. Por exemplo, ao criar um TableAdapter baseado em uma tabela de um banco de dados chamada Orders, o TableAdapter seria nomeado OrdersTableAdapter. O nome de classe do TableAdapter pode ser alterado usando a propriedade Name no Dataset Designer. Estes so os mtodos e propriedades mais usados de TableAdapters: Membro
TableAdapter.Fill
Descrio Preenche a tabela de dados associada ao TableAdapter com os resultados do comando SELECT. Para obter mais informaes, consulte Como: preencher uma DataSet com dados.
Visual C# Consolidado
923
TableAdapter.Update
Envia alteraes de volta ao banco de dados. Para obter mais informaes, consulte Como: atualizar dados usando um TableAdapter. Retorna uma nova DataTable preenchida com dados. Cria uma nova linha na tabela de dados. Para obter mais informaes, consulte Como adicionar linhas ao um DataTable.
TableAdapter.GetData TableAdapter.Insert
TableAdapter.ClearBeforeFill Determina se uma tabela de dados esvaziada antes de chamar um dos mtodos Fill.
Mtodo Update do TableAdapter Os TableAdapters usam comandos de dados para leitura e gravao no banco de dados. A consulta Fill inicial do TableAdapter usada como base para criar o esquema da tabela de dados associada, bem como os comandos InsertCommand, UpdateCommand, e DeleteCommand associados ao mtodo TableAdapter.Update. Isso significa que chamar um mtodo Update de um TableAdapter executa as instrues criadas quando o TableAdapter foi originalmente configurado, e no uma das consultas adicionais adicionadas com o TableAdapter Query Configuration Wizard. Quando voc usar um TableAdapter, ele efetivamente executa as mesmas operaes com os comandos que voc geralmente deseja executar. Por exemplo, quando voc chamar o mtodo Fill do adaptador, o adaptador executa o comando de dados na sua propriedade SelectCommand e usa uma leitora de dados (por exemplo, SqlDataReader) para carregar o resultado na tabela de dados. Da mesma forma, quando voc chamar o mtodo Update do adaptador, ele executa o comando apropriado (nas propriedades DeleteCommand, UpdateCommand, e InsertCommand) para cada mudana na tabela de dados. Observao Se no houver informaes suficientes na consulta principal, os comandos InsertCommand, UpdateCommand, e DeleteCommand so criados por padro quando o TableAdapter gerado. Se a consulta principal do TableAdapter uma declarao SELECT de mais de uma tabela , possvel que o designer no consiga gerar os comandos InsertCommand, UpdateCommand, e DeleteCommand. Se esses comandos no so gerados, voc poder receber um erro ao executar o mtodo TableAdapter.Update. GenerateDbDirectMethods do TableAdapter Alm dos comandos InsertCommand, UpdateCommand, e DeleteCommand, TableAdapters so criados com mtodos que podem ser executados diretamente no banco de dados. Estes mtodos (TableAdapter.Insert, TableAdapter.Update, e TableAdapter.Delete) podem ser chamados diretamente para manipular dados no banco de dados. Se voc no deseja criar esses mtodos diretos, defina a propriedade GenerateDbDirectMethods do TableAdapter como false (na janela Properties). Consultas adicionais do TableAdapter so consultas autnomas que no geram esses mtodos. Suporte do TableAdapter para tipos Nullable
Visual C# Consolidado
924
Os TableAdapters oferecem suporte a tipos anulveis Nullable(Of T) e T?. Para obter mais informaes sobre tipos nullable no Visual Basic, consulte Value Types that Might Not Have a Defined Value. Para obter mais informaes sobre tipos anulveis em C#, consulte Usando Nullable tipos (C# programao guia).
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
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
Visual C# Consolidado
925
3. 4.
o
Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-o. -ouSelecione New Connection para abrir a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique Finish. A NorthwindDataSet adicionada ao seu projeto e a tabela Customers aparece na janela Data Sources. Abrindo o DataSet no Dataset Designer
5. 6. 7. 8.
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
Executando o aplicativo
Pressione F5. A grade preenchida com clientes com um valor City de Seattle. Prximas etapas
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
Visual C# Consolidado
927
aplicativo no usar DataSets, use objetos de comando para executar instrues SQL ou procedimentos armazenados diretamente em um banco de dados. Para obter mais informaes Preenchendo um DataSet usando um TableAdapter TableAdapters Preencher um DataSet com um adaptador de dados Preenchendo DataSets Se voc criar um DataSet com uma ferramenta de design de em tempo de execuo Visual Studio (tais como o Dataset Designer ou o Assistente para Configurao da Fonte de Dados), ento voc usar um TableAdapter para preench-lo. TableAdapters executam procedimentos armazenados ou instrues SQL. Se voc criar um DataSet sem ferramentas em tempo de design, voc deve utilizar adaptadores de dados para preencher e atualizar os dados. (TableAdapters no so realmente classes no .NET Framework, ento no so adequados para trabalhar com DataSets que tenham sido criados sem o uso de ferramentas em tempo de execuo. Para obter mais informaes sobre carregar dados em DataSets com TableAdapters ou adaptadores de dados, consulte Como: preencher uma DataSet com dados. Consultas TableAdapter Voc pode executar consultas TableAdapter para preencher dados em DataSets (Mais especificamente, para carregar dados para o DataTables que compem um DataSet). Voc pode criar consultas TableAdapter usando o Assistente de configurao da consulta TableAdapter no Dataset Designer. Consultas TableAdapter aparecem como mtodos nomeados num TableAdapter e so executados chamando o mtodo TableAdapter. Para obter mais informaes sobre como criar e executar consultas TableAdapter, consulte as seguintes pginas:
Consulte Como: preencher uma DataSet com dados Viso Geral do Adaptador de Tabela Populating a DataSet from a DataAdapter
Como criar e executar uma instruo SQL que retorna linhas: Como criar e executar uma instruo SQL que retorna um nico valor: Como: criar e executar uma instruo SQL que no retorna nenhum valor Como: Executar um Procedimento Armazenado que Retorna Linhas: Como: executar um procedimento armazenado que retorna um nico valor Como executar um procedimento armazenado que no retorna valor:
Objetos Command Objetos de comando (command) lhe do a capacidade de executar instrues SQL e procedimentos armazenados diretamente em um banco de dados, sem precisar de um DataSet, TableAdapter, ou DataAdapter. (O termo objeto de comando refere-se ao comando especfico .NET Framework Data Provider que o aplicativo est usando. Por exemplo, se seu aplicativo estiver usando o .NET Framework Data Provider para SQL Server, o objeto de comando poderia ser SqlCommand.)
Visual C# Consolidado
928
Voc configura comandos para consultar dados usando instrues SQL ou procedimentos armazenados, configurando a propriedade CommandType do comando de dados para um dos valores na enumerao CommandType. Defina o CommandType. para Text para executar instrues SQL, ou defina-o para StoredProcedure para executar procedimentos armazenados. Em seguida, defina a propriedade CommandText como um instruo SQL ou como o nome do procedimento armazenado. Seguida, voc pode executar o comando de dados chamando um dos mtodos de execuo (ExecuteReader, ExecuteScalar, ExecuteNonQuery). Cada um dos .NET Framework Data Providers oferece um objeto comando otimizado para bancos de dados especficos. Usando comandos de dados, voc pode fazer o seguinte em seu aplicativo:
Executar comandos Select (selecionar) que retornam um resultado que voc pode ler diretamente, em vez de carreg-lo no DataSet. Para ler os resultados, use uma leitora de dados (objeto OleDbDataReader, SqlDataReader, OdbcDataReader ou OracleDataReader), que funciona como um cursor somente para leitura, somente encaminhamento ao qual voc pode vincular controles.. Esta uma estratgia til para reduzindo uso de memria e carregar dados somente para leitura muito rapidamente. Executar comandos de definio de banco de dados (DDL) para criar, editar e remover tabelas, procedimentos armazenados e outras estruturas de banco de dados. (Voc deve ter permisses para executar essas aes, claro.) Executar comandos para obter informaes de catlogo do banco de dados. Executar comandos SQL dinmicos para atualizar, inserir ou excluir registros em vez de atualizar tabelas DataSet e depois copiar alteraes para o banco de dados. Executar comandos que retornam um valor escalar (isto , um valor nico), como os resultados de uma funo agregada (SUM, COUNT, AVG, e assim por diante). Executar comandos que retornam dados de um banco de dados do SQL Server (verso 7.0 ou posterior) no formato XML. Um uso tpico executar uma consulta e obter novamente dados em formato XML, aplicar um transformao XSLT a ele (para converter os dados em HTML), e enviar os resultados para um navegador.
Propriedades de comando contm todas as informaes necessrias para executar um comando em um banco de dados. Isso inclui:
O comando referencia uma conexo que ele usa para se comunicar com
O nome ou texto de um comando O comando inclui o texto real de uma intruo SQL ou o nome de um procedimento armazenado para executar. Parmetros Um comando pode exigir que voc passe valores de parmetro junto com ele (parmetros de entrada). O comando tambm pode retornar valores sob a forma de um valor de retorno ou valores de parmetro de sada. Cada comando tem um conjunto de parmetros que voc pode definir ou ler individualmente para passar ou receber valores. Para obter mais informaes, consulte Como: Definir e Obter Parmetros para Objetos de Comando.
Voc executa um comando usando um mtodo apropriado para os resultados que voc espera que sejam retornados. Por exemplo, se voc espera linhas, voc chama o comando do mtodo ExecuteReader, que retorna registros em uma leitora de dados. Se voc estiver executando um comando UPDATE, INSERT, ou Delete, voc chama o mtodo do comando ExecuteNonQuery, que retorna um valor indicando o nmero de linhas afetadas. Se voc estiver executando uma funo agregada, como retornar a contagem de pedidos para um cliente, voc chamar o mtodo ExecuteScalar.
Visual C# Consolidado
929
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
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
No menu Data, clique em Show Data Sources. Na janela Data Sources, clique em Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e em seguida clique em Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais (sensitive data), e clique em Next. Clique em Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique em Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Adicionando Controles ao Formulrio
5. 6. 7. 8.
Voc pode criar controles com dados vinculados, arrastando itens da janela Data Sources para um formulrio no seu aplicativo do Windows.
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.
3.
Opcionalmente, voc pode copiar este cdigo para outras partes do seu aplicativo onde voc precisar preencher o dataset. Executando 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:.
Visual C# Consolidado
932
Este explicao passo a passo consiste das cinco etapas principais: 1. 2. 3. 4. 5. Criando um novo projeto. Criar um arquivo XML a ser lido no DataSet. Criando a interface do usurio. Criando o DataSet, leia o arquivo XML, e o exiba em um controle DataGridView. Adicionando cdigo para exibir o esquema XML baseado no arquivo XML em um controle TextBox.
Observao As caixas de dilogo e comandos de menu que voc ve podem diferir das descritas na Ajuda dependendo das suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Criar um novo projeto Nesta etapa, voc criar um projeto Visual Basic, Visual C#, ou Visual J# que ir conter esta explicao passo a passo.
Visual C# Consolidado
933
548-7723</phone> <address>589 Darwin Ln.</address> <city>Berkeley</city> <state>CA</state> <zip>94705</zip> <contract>true</contract> </authors> <authors> <au_id>267-412394</au_id> <au_lname>Hunter</au_lname> <au_fname>Anne</au_fname> <phone>408 286-2428</phone> <address>22 Cleveland Av. #14</address> <city>San Jose</city> <state>CA</state> <zip>95128</zip> <contract>true</contract> </authors> <authors> <au_id>274-80-9391</au_id> <au_lname>Straight</au_lname> <au_fname>Dean</au_fname> <phone>415 834-2919</phone> <address>5420 College Av.</address> <city>Oakland</city> <state>CA</state> <zip>94609</zip> <contract>true</contract> </authors> </Authors_Table>
4.
Um controle DataGridView que ir exibir o contedo do arquivo XML como dados. Um controle TextBox que exibir o esquema XML para o arquivo XML. Dois controles Button. Um boto l o arquivo XML para o DataSet e exibe-o no controle DataGridView. Um segundo boto extrai o esquema do DataSet, e por um StringWriter exibe-o no controle TextBox.
Abra Form1 no modo Design. No Toolbox, arraste os seguintes controles no formulrio: Um controle DataGridView Um controle TextBox Dois controles Button Defina as seguintes propriedades: Controle
TextBox1
3.
Button1
Name Text
Button2
Name Text
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.
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.
Visual C# Consolidado
935
Testando Agora voc pode testar o formulrio para certificar-se de que ele funciona comforme o esperado.
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.
Como: Conectar-se a Dados em um Banco de Dados Como se conectar a dados em um objeto: Como: se conectar a dados em um servio da
Visual C# Consolidado
936
Web
Como: Conectar-se a Dados em um Banco de Dados SQL Server Express Como: Conectar a dados em um banco de dados do Access:
Definir os itens na janela Data Sources para os controles que voc deseja que estejam criados
Como: Definir o controle a ser criado quando arrastado da janela Data Sources:
Como exibir dados em um controle Windows Forms DataGridView: Como: Exibir Dados em controles individuais Windows Forms Encadernao dados para controles existente como:
Depois de ter criado um formulrio que exibe dados, voc pode desejar seguir uma das seguintes tarefas: Tarefa Editar os dados na fonte de dados subjacentes Para obter mais informaes Editar dados no seu aplicativo (tenha em mente que alteraes nos dados em controles com dados vinculados so gravadas automaticamente no dataset, mas no so salvas automaticamente no banco de dados subjacente.) Validando dados
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).
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
Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o aplicativo Windows
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.
No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-a. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Definindo os controles a serem criados
5. 6. 7. 8.
Para este explicao passo a passo os dados estaro em um layout Details onde dados so exibidos em controles individuais. (A abordagem alternativa o layout padro Grid onde os dados so exibidos em um controle DataGridView.)
3.
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
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:.
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
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
No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista drop-down, selecione-o. -ouSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Criando controles para exibir dados da tabela Customers
5. 6. 7. 8.
Para criar controles para exibir os dados do cliente (customer) (registros pai)
1. 2. 3. Na janela Data Sources, selecione a tabela Customers, e clique na seta suspensa. Escolha Details no menu. Arraste o n principal Customers da janela Data Sources na parte superior do Form1. Controles com dados vinculados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa de ferramenta. (BindingNavigator) para navegar pelos registros
Visual C# Consolidado
942
Um NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja do componente. Criando controles para exibir dados da tabela Orders
Para criar controles para exibir os pedidos (orders) para cada cliente (registros filho)
Na janela Data Sources, expanda o n Customers e selecione a ltima coluna na tabela Customers, que um n expansvel Orders, e arraste-o para a parte inferior do Form1. Um DataGridView adicionado ao formulrio, e um novo BindingSource. (OrdersBindingSource) e TableAdapter (OrdersTableAdapter) so adicionados bandeja de componentes. Observao Abra a Properties Window e selecione o OrdersBindingSource. Inspecione o DataSource e as propriedades DataMember para ver como a ligao est configurada para exibir registros relacionados. A DataSource est definida como CustomersBindingSource (a tabela pai do BindingSource), em vez da tabela Orders. A propriedade DataMember definida como FK_Orders_Customers, que o nome do objeto DataRelation que relaciona as tabelas juntas. Testando o aplicativo
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.
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
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.
No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e em seguida clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e em seguida clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a Tablea Customers, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Criando o formulrio
5. 6. 7. 8.
Voc pode criar os controles vinculados a dados arrastando itens da janela Data Sources para seu formulrio.
1. 2.
Expanda o n Customers na janela Data Sources. Arraste o n Customers da janela Data Sources para seu formulrio. Um DataGridView e uma faixa ferramenta (BindingNavigator) para navegar pelos registros aparecem no formulrio. Um NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja do componente. Adicionando Parametrizao (funcionalidade de pesquisa) Consulta
Voc pode adicionar uma clusula WHERE consulta original usando o Caixa de Dilogo Construtora de Critrios de Pesquisa.
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.
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
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
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
Visual C# Consolidado
947
3. 4.
o
Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-o. - ou Selecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se o seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e as duas tabelas aparecem na janela Data Sources . Criando controles vinculados a dados no formulrio
5. 6. 7. 8.
3. 4.
Arraste o n principal Customers da janela Data Sources diretamente para a combo box CustomerID no Form1. Observao A tabela a seguir somente para referncia; as propriedades so definidas automaticamente durante o arraste do procedimento acima. O designer define as propriedades a seguir conforme descrito abaixo em " Explicao das configuraes ". Dependendo das estruturas da sua tabela, voc talvez precise ajustar as propriedades para a sua tabela de pesquisa funcionar corretamente. Propriedade DataSource Explicao sobre configurao O Visual Studio define essa propriedade como o BindingSource criado para a tabela que voc arrastou para o controle (em vez do BindingSource criado quando o controle foi criado).
Visual C# Consolidado
948
Se voc precisar fazer um ajuste, ento defina essa propriedade como o BindingSource da tabela com a coluna que voc quer mostrar. (CustomersBindingSource para este passo a passo.) DisplayMember O Visual Studio define essa propriedade como a primeira coluna aps a chave primria que tem um tipo de dados string para a tabela que voc arrastar para o controle. Se voc precisar fazer um ajuste, defina essa propriedade como o nome da coluna que voc deseja exibir. O Visual Studio define esta propriedade como a primeira coluna participante da chave primria, ou a primeira coluna na tabela se nenhuma chave estiver definida. Se voc precisar fazer um ajuste, defina essa propriedade como a chave primria na tabela com a coluna que voc deseja exibir. O Visual Studio define essa propriedade como a coluna original arrastada da janela Data Sources. Se voc precisar fazer um ajuste, defina essa propriedade como a coluna de chave externa na tabela relacionada. (CustomerID na tabela Orders para esse passo a passo.)
ValueMember
SelectedValue
Executando o aplicativo
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
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
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.
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.
No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-o. Ou Selecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Definindo a Coluna de Telefone Para usar o Controle PhoneNumberBox
5. 6. 7. 8.
Dentro da janela Data Sources voc pode definir o controle a ser criado antes de arrastar itens para seu formulrio.
Visual C# Consolidado
952
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
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
Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um Aplicativo Windows
1. 2. 3.
No Visual Studio, a partir do menu File, crie um novo Project. Nomeie o projeto como ComplexControlWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto ComplexControlWalkthrough criado e adicionado Solution Explorer. Adicionar um controle de usurio ao projeto
Devido esta explicao passo a passo criar um controle de ligao de dados complexa do User Control, voc deve adicionar um item User Control no projeto
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.
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.
No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, a selecione. OuSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique Finish.
5. 6. 7. 8.
Visual C# Consolidado
956
O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Definindo a tabela de Clientes para usar o controle ComplexDataGridView Dentro da janela Data Sources voc pode definir o controle a ser criado, antes de arrastar itens para seu formulrio.
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
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
Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um aplicativo Windows
1. 2. 3.
No Visual Studio, a partir do menu File, crie um novo Project. Nome do projeto LookupControlWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto LookupControlWalkthrough criado e adicionado Solution Explorer. Adicionar um controle de usurio ao projeto
Esta explicao passo a passo cria um controle de pesquisa User Control, para adicionar um item User Control ao projeto LookupControlWalkthrough
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.
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.
Visual C# Consolidado
960
4.
o
Na pgina Choose your Data Connection e siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. OuSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela do Data Sources Defini a coluna CustomerID da tabela Pedidos para usar o controle LookupBox
5. 6. 7. 8.
Dentro da janela Data Sources voc pode definir o controle a ser criado antes de arrastar itens para seu formulrio.
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
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
Pressione F5 para executar o aplicativo. Navegue em alguns registros e verifique se a CompanyName aparece no controle
LookupBox
Consulte tambm
Carregando dados em objetos (normalmente de um banco de dados) Criar uma coleo tipada de objetos Adio de objetos para uma coleo e remoo de objetos de uma coleo Exibir os dados de objeto aos usurios em um formulrio Alterao/edio de dados em um objeto Salvar dados a partir objetos de volta ao banco de dados Observao
Para melhor entender, e fornecer contexto para os exemplos nesta pgina, recomendvel que voc aperfeioe o seguinte: Passo-a-Passo: Conectando a dados em Objetos. Esta explicao passo a passo cria os objetos discutidos nesta pgina de ajuda. Carregando dados em objetos Para esse exemplo, voc carrega dados para os objetos usando TableAdapters. Por padro, TableAdapters so criados com dois tipos de mtodos que buscam dados de um banco de dados e preenchem tabelas de dados.
Visual C# Consolidado
962
O mtodo TableAdapter.Fill preenche uma tabela de dados existente com os dados retornados. O mtodo TableAdapter.GetData retorna uma nova tabela dados preenchida com dados.
A maneira mais fcil de carregar os objetos personalizados com dados chamar o mtodo TableAdapter.GetData, efetuar um loop atravs da coleo de linhas na tabela de dados retornados, e preencher cada objeto com os valores em cada linha. Voc pode criar um mtodo GetData que retorna uma tabela de dados preenchida para qualquer consulta adicionada a um TableAdapter. Observao Visual Studio nomeia as consultas TableAdapter Fill e GetData por padro, mas esses nomes podem ser alterados para qualquer nome de mtodo vlido. O exemplo a seguir mostra como percorrer as linhas de uma tabela de dados e preencher um objeto com dados: Para obter um exemplo de cdigo completo, consulte Passo-a-Passo: Conectando a dados em Objetos. C#
private void LoadCustomers() { NorthwindDataSet.CustomersDataTable customerData = customersTableAdapter1.GetTop5Customers(); foreach (NorthwindDataSet.CustomersRow customerRow in customerData) { Customer currentCustomer = new Customer(); currentCustomer.CustomerID = customerRow.CustomerID; currentCustomer.CompanyName = customerRow.CompanyName; if (customerRow.IsAddressNull() == false) { currentCustomer.Address = customerRow.Address; } if (customerRow.IsCityNull() == false) { currentCustomer.City = customerRow.City; } if (customerRow.IsContactNameNull() == false) { currentCustomer.ContactName = customerRow.ContactName; } if (customerRow.IsContactTitleNull() == false) { currentCustomer.ContactTitle = customerRow.ContactTitle; } if (customerRow.IsCountryNull() == false) { currentCustomer.Country = customerRow.Country; } if (customerRow.IsFaxNull() == false) { currentCustomer.Fax = customerRow.Fax; } if (customerRow.IsPhoneNull() == false) { currentCustomer.Phone = customerRow.Phone; } if (customerRow.IsPostalCodeNull() == false) { currentCustomer.PostalCode = customerRow.PostalCode; } if (customerRow.IsRegionNull() == false) { currentCustomer.Region = customerRow.Region; } LoadOrders(currentCustomer); customerBindingSource.Add(currentCustomer); } }
Criando uma coleo tipada de objetos Voc pode criar classes de coleo para os objetos ou usar as colees tipadas que so automaticamente fornecidas pelo BindingSource Component. Quando voc estiver criando uma classe de coleo personalizada para objetos, recomendvel que voc herde da BindingList. Essa classe genrica fornece funcionalidade para administrar sua coleo, bem como a capacidade de evocar eventos que enviam notificaes para a infraestrutura de vinculao de dados no Windows Forms. A coleo gerada automaticamente no BindingSource usa um BindingList para sua coleo tipada. Se seu aplicativo no requerer funcionalidade adicional, ento voc pode manter sua
Visual C# Consolidado
963
coleo dentro do BindingSource. Para obter mais informaes, consulte a propriedade List da classe BindingSource. Observao Se sua coleo exigir funcionalidade no fornecida pela implementao base do BindingList, ento voc deve criar uma coleo personalizada para que voc possa adicionar classe, conforme o necessrio. O cdigo a seguir mostra como criar a classe de uma coleo fortemente tipada de objetos Order: C#
/// <summary> /// A collection of Orders /// </summary> public class Orders: System.ComponentModel.BindingList<Order> { // Add any additional functionality required by your collection. }
Adicionando objetos a uma coleo Voc adiciona objetos a uma coleo chamando o mtodo Add de sua classe de coleo personalizada ou do BindingSource. Para obter um exemplo de como adicionar a uma coleo usando o BindingSource, consulte o mtodo LoadCustomers em Passo-a-Passo: Conectando a dados em Objetos Para obter um exemplo de como adicionar objetos a uma coleo personalizada, consulte o mtodo LoadOrders em Passo-a-Passo: Conectando a dados em Objetos. Observao O mtodo Add fornecido automaticamente para sua coleo personalizada quando voc herda do BindingList. O cdigo a seguir mostra como adicionar objetos a uma coleo tipada em um BindingSource: C#
Customer currentCustomer = new Customer(); customerBindingSource.Add(currentCustomer);
O cdigo a seguir mostra como adicionar objetos a uma coleo tipada que herda do BindingList: Observao Neste exemplo a coleo Orders uma propriedade do objeto Customer. C#
Order currentOrder = new Order(); currentCustomer.Orders.Add(currentOrder);
Visual C# Consolidado
964
Voc remove objetos de uma coleo, chamando o mtodo Remove ou RemoveAt de sua classe de coleo personalizada ou do BindingSource. Observao Os mtodos Remove e RemoveAt so fornecidos automaticamente para sua coleo personalizada quando voc herda do BindingList. O cdigo a seguir mostra como localizar e remover objetos da coleo tipada em um BindingSource com o mtodo RemoveAt: C#
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI"); customerBindingSource.RemoveAt(customerIndex);
Exibindo dados de objeto aos usurios Para exibir os dados em objetos para usurios, voc cria uma fonte de dados objeto usando o Assistente para Configurao da Fonte de Dados, e arrasta o objeto inteiro ou propriedades individuais para seu formulrio a partir da janela Data Sources. Para obter mais informaes sobre como criar uma fonte de dados objeto, consulte Como se conectar a dados em um objeto:. Para obter mais informaes sobre como exibir dados a partir de objetos no Windows Forms, consulte Exibir dados em formulrios em aplicativos do Windows. Modificando os dados nos objetos Para editar dados em objetos personalizados que so vinculados a dados para controles Windows Forms, basta editar os dados no controle acoplado (ou diretamente nas propriedades do objeto). A arquitetura de vinculao de dados ir atualizar os dados no objeto. Se seu aplicativo requerer o rastreamento de alteraes e recuo nas alteraes propostas para seus valores originais, ento voc deve implementar essa funcionalidade no seu modelo de objeto. Para exemplos de como tabelas de dados mantm-se informadas das alteraes propostas, consulte DataRowState, HasChanges, e GetChanges. Salvando dados em objetos de volta ao banco de dados Voc salva dados de volta para o banco de dados passando os valores de seu objeto para os mtodos DBDirect do TableAdapter. O Visual Studio cria mtodos DBDirect que podem ser executados diretamente no banco de dados. Esses mtodos no requerem objetos DataSet ou DataTable. Mtodo DBDirect do TableAdapter
TableAdapter.Insert
Descrio Adiciona novos registros a um banco de dados, permitindo que voc passe valores individuais de coluna como parmetros do mtodo.
Visual C# Consolidado
965
TableAdapter.Update
Atualizaes de registros existentes em um banco de dados. O mtodo Update aceita valores originais e a novos valores de coluna como parmetros do mtodo. Os valores originais so usados para localizar o registro original, e os novos valores so usados para atualizar esse registro. O mtodo TableAdapter.Update tambm usado para acomodar as alteraes em um dataset de volta ao banco de dados fazendo o DataSet, DataTable, DataRow, ou matriz de DataRows como parmetros do mtodo.
TableAdapter.Delete
Exclui registros existentes do banco de dados com base nos valores originais da coluna que foram passados como parmetros do mtodo.
Para salvar dados de uma coleo de objetos, percorra a coleo de objetos (por exemplo, usando um loop for-next) e envie os valores de cada objeto para o banco de dados usando mtodos DBDirect do TableAdapter. O exemplo a seguir mostra como usar o mtodo TableAdapter.Insert do DBDirect para adicionar um novo cliente diretamente ao banco de dados: C#
private void AddNewCustomers(Customer currentCustomer) { customersTableAdapter.Insert( currentCustomer.CustomerID, currentCustomer.CompanyName, currentCustomer.ContactName, currentCustomer.ContactTitle, currentCustomer.Address, currentCustomer.City, currentCustomer.Region, currentCustomer.PostalCode, currentCustomer.Country, currentCustomer.Phone, currentCustomer.Fax); }
Visual C# Consolidado
966
de uma tabela de dados. Localize os registros alterados em uma tabela de dados. Acesso verses diferentes de uma linha em uma tabela de dados. Localize linhas com erros em uma tabela de dados.
tabela. For more information, see Como: Excluir linhas em uma DataTable. Chame o GetChanges mtodo de uma tabela de dados. For more information, see Como: Recuperar Linhas Alteradas. Acesso as colunas individuais de uma linha de dados por passagem em voc DataRowVersion deseja exibir. For more information, see Como: Obter Verses Especficas de um DataRow. Verificar a HasErrors propriedade de uma tabela de dados. For more information, see Como: Localizar linhas com erros:.
Criando sua prpria validao especfica do aplicativo que pode verificar dados durante alteraes em valores em uma coluna de dados individual. Para obter mais informaes, consulte Como: validar dados durante alteraes em coluna. Criando sua prpria validao especfica do aplicativo que pode verificar dados durante alteraes em valores enquanto um linha de dados inteira est sendo alterada. Para obter mais informaes, consulte Como: Validar Dados Durante Alteraes de Linha. Ao criar chaves, restries exclusivas, e assim por diante como parte da definio do esquema real do DataSet. Para obter mais informaes sobre incorporar validao na definio de esquema, consulte Como definir uma coluna de dados como a chave primria: e Como restringir uma coluna de dados contm valores exclusivos para:. Definindo as propriedades do objeto DataColumn como MaxLength, AllowDBNull e Unique
Visual C# Consolidado
967
H vrios eventos que so gerados pelo objeto DataTable quando uma alterao est ocorrendo em um registro:
Os eventos ColumnChanging e ColumnChanged so gerados durante e aps cada alterao em uma coluna individual. O evento ColumnChanging til quando voc deseja validar alteraes em colunas especficas. Informaes sobre a alterao proposta so passadas como um argumento para o evento. Para obter mais informaes, consulte Como: validar dados durante alteraes em coluna. Os eventos RowChanging e RowChanged so gerados durante e aps qualquer alterao em uma linha. O evento RowChanging mais geral, porque ele simplesmente indica que uma alterao est ocorrendo em algum lugar na linha; voc no souber qual coluna foi alterada. Para obter mais informaes, consulte Como: Validar Dados Durante Alteraes de Linha.
Por padro, cada alterao em uma coluna gera quatro eventos: Primeiro o evento ColumnChanging e ColumnChanged para a coluna especfica sendo alterada, e depois os eventos RowChanging e RowChanged se vrias alteraes forem sendo feitas para a linha, os eventos sero gerados para cada alterao. Observao O mtodo da linha de dados BeginEdit desliga os eventos RowChanging e RowChanged aps cada alterao de colunas individuais. Nesse caso, o evento no gerado at que o mtodo EndEdit tenha sido chamado, quando os eventos RowChanging. e RowChanged eventos so gerados apenas uma vez Para obter mais informaes, consulte Como: desativar restries ao preencher um DataSet. O evento que voc escolher depende de quo granulada seja a validao que voc deseja. Se ele for importante que voc atualize um erro imediatamente quando uma coluna for alterada, criando validao usando o evento ColumnChanging. Caso contrrio, use o evento RowChanging que pode resultar em captura de vrios erros ao mesmo tempo. Alm disso, se seus dados so estruturados de tal forma que o valor de uma coluna validada com base no contedo de outra coluna, ento voc deve executar a validao durante o evento RowChanging. Quando registros so atualizados, o objeto DataTable gera eventos que voc pode responder para as alteraes que esto ocorrendo e depois que as alteraes forem feitas. Se seu aplicativo estiver usando um DataSet tipado, voc pode criar manipuladores de eventos altamente tipados. Isso adicionar quatro eventos tipados que voc pode criar manipuladores; dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeleting e dataTableNameRowDeleted. Esses manipuladores de eventos tipados passam um argumento que inclui o nome das colunas da tabela que tornam mais fcil para cdigo gravar e ler. Eventos de atualizao de dados Evento Descrio
ColumnChanging O valor em uma coluna est sendo alterado. O evento passa a linha e coluna para voc, juntamente com o novo valor proposto. ColumnChanged RowChanging O valor em uma coluna foi alterado. O evento passa a linha e coluna para voc, juntamente com o valor proposto. Alteraes feitas em um objeto DataRow esto prestes a serem confirmadas de volta para o DataSet. Se voc no tiver chamado o mtodo BeginEdit, o
Visual C# Consolidado
968
evento RowChanging gerado para cada alterao em uma coluna imediatamente aps o evento ColumnChanging que foi gerado. Se voc no chamou BeginEdit antes de fazer alteraes, o evento RowChanging gerado somente quando voc chamar o mtodo EndEdit. O evento passa a linha para voc e um valor indicando o tipo de ao (alterar, inserir, e assim por diante) que est sendo executada. RowChanged RowDeleting RowDeleted Uma linha foi alterada. O evento passa a linha para voc e um valor indicando o tipo de ao (alterar, inserir, e assim por diante) que est sendo executada. Uma linha est sendo excluda. O evento passa a linha para voc e um valor indicando o tipo de ao (Excluir) que est sendo executada. Uma linha foi excluda. O evento passa a linha para voc e um valor indicando o tipo de ao (Excluir) que est sendo executada.
Os eventos ColumnChanging, RowChanging e RowDeleting so gerados durante o processo de atualizao Voc pode utilizar esses eventos para validar dados ou executar outros tipos de processamento. Porque as atualizaes esto em processo durante esses eventos, possvel cancelar a atualizao, atravs de uma exceo, que impede a alterao que est sendo completada. Os eventos ColumnChanged, RowChanged e RowDeleted so eventos de notificao que so gerados quando uma atualizao foi concluda com xito. Esses eventos so teis quando voc desejar fazer outra ao com base em uma atualizao bem sucedida. Consulte tambm Tarefas
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
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
No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique em Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista suspensa, selecione-o. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais (include sensitive data), e clique em Next. Clique em Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Order Details, e clique em Finish.
5. 6. 7. 8.
Visual C# Consolidado
970
O NorthwindDataSet adicionado ao seu projeto e a tabela OrderDetails aparece na janela Data Sources. Criando Controles ligados a Dados
Testando o Aplicativo
1. 2. 3. 4.
Pressione F5 para executar o aplicativo. Altere o valor na caixa de texto Quantity para 0. Pressione TAB para mover o foco para fora da caixa de texto. O cone do provedor de erros (error provider) aparecer. Posicione o ponteiro do mouse sobre o provedor de erros para ver a mensagem. Prximas etapas
Dependendo dos seus requisitos de aplicativo, h vrias etapas que voc pode desejar executar aps adicionar validao. Alguns aprimoramentos que voc pode fazer a esta explicao passo a passo incluem:
Adicionar funcionalidade para enviar atualizaes de volta para o banco de dados. Para obter mais informaes, consulte Passo-a-Passo: Salvando Dados para um Banco de Dados (Tabela Simples). Editar o dataset para adicionar ou remover objetos de banco de dados. Para obter mais informaes, consulte Como editar um DataSet:.
Visual C# Consolidado
972
possa usar adaptadores diferentes, por exemplo, para mover dados de uma fonte de dados para outra ou para atualizar vrias fontes de dados. Processo de atualizao de dois estgios e a funo do DataRowVersion em uma atualizao bem sucedida
Estruturalmente, um dataset torna dados disponveis como conjuntos de colees. Datasets contm colees de tabelas. Tabelas contm colees de linhas. Tabelas so expostas como uma coleo do objeto DataSet e registros esto disponveis na coleo Rows de objetos DataTable. Fazer alteraes dos dados em um dataset por simples manipulao dessas colees usando mtodos de coleo de base possvel, mas se voc pretende atualizar uma fonte de dados subjacente voc deve usar os mtodos especificamente projetados para modificao de dataset. Por exemplo, para remover um registro de uma tabela de dados, voc poderia chamar o Mtodo RemoveAt da coleo Rows da tabela, que fisicamente exclui o registro do dataset. Se voc estiver usando o dataset somente como um armazenamento estruturado para dados e no estiver preocupado em transmitir mudana de informaes para um outro aplicativo, manipular colees dessa maneira um modo aceitvel de atualizao um dataset. Entretanto, se voc pretende enviar alteraes para uma fonte de dados ou outro aplicativo, voc precisar manter informaes de alteraes (isto , metadados) sobre cada atualizao. Posteriormente, quando voc enviar alteraes para a fonte de dados ou aplicativo, o processo ter as informaes necessrias para localizar e atualizar os registros adequados. Por exemplo, se voc excluir um registro no dataset, informaes sobre o registro excludo devem ser mantidas no dataset. Dessa forma, quando o DeleteCommand do TableAdapter chamado, h informaes suficientes para localizar o registro original em uma fonte de dados para que este possa ser excludo. Para obter mais informaes, consulte " Mantendo Informaes Sobre Alteraes " abaixo. Mesclando DataSets
Visual C# Consolidado
973
Voc pode atualizar o contedo de um dataset mesclando isto , copiando o contedo de um dataset (chamado de dataset origem) para o dataset chamado (referido como o dataset destino). Quando voc mescla datasets, novos registros na fonte do dataset so adicionados para o dataset destino. Alm disso, colunas extras do dataset fonte so adicionadas ao dataset destino. Mesclar datasets particularmente til quando voc tiver um dataset local e obter um segundo dataset de outro aplicativo ou de um componente como um XML Web Services. Tambm til quando voc precisa integrar dados de vrios datasets. Quando datasets so mesclados, tambm possvel passar um argumento booleano opcional (preserveChanges) que informa ao mtodo Merge se deseja manter modificaes existentes no dataset destino. Como datasets mantm vrias verses de registros, importante ter em mente que mais de uma verso dos registros est sendo mesclada. A tabela a seguir ilustra um registro em dois datasets que sero mesclados: DataRowVersion Original Atual DataSet destino James Wilson Jim Wilson DataSet origem James C. Wilson James C. Wilson
Chamar o mtodo Merge na tabela acima com preserveChanges=false targetDataset.Merge(sourceDataset) resulta no seguinte: DataRowVersion Original Atual DataSet destino James C. Wilson James C. Wilson DataSet origem James C. Wilson James C. Wilson
Chamar o mtodo Merge com preserveChanges = true targetDataset.Merge(sourceDataset, true) resulta no seguinte: DataRowVersion Original Atual Cuidado No cenrio preserveChanges = true, se o mtodo RejectChanges for chamado em um registro no dataset destino, ento ele reverter para os dados originais do dataset origem. Isso significa que se voc tentar atualizar a fonte de dados original com o dataset destino, ele pode no ser capaz de localizar a linha original para atualizar. Entretanto, voc pode impedir uma violao simultnea preenchendo outro dataset com os registros atualizados a partir da fonte de dados e, ento, executar uma mesclagem impedindo uma violao simultnea. (Uma violao simultnea ocorre quando outro usurio modifica um registro na fonte de dados aps o dataset ter sido preenchido). Para obter mais informaes, consulte Controle de concorrncia no ADO.NET. Restries de Atualizao Para fazer alteraes em um linha de dados existente, voc adiciona ou atualiza dados nas colunas individuais. Se o dataset contiver restries (como chaves externas ou restries noanulveis), possvel que voc atualize um registro aps voc ter terminado de atualizar uma coluna, mas antes que voc obtenha a prxima o registro pode temporariamente estar em um estado de erro. DataSet destino James C. Wilson Jim Wilson DataSet origem James C. Wilson James C. Wilson
Visual C# Consolidado
974
Para evitar violaes de restrio voc pode temporariamente suspender restries de atualizao. Isso serve para duas finalidades:
Ela impede que um erro seja jogado quando voc atualiza uma coluna antes de obter a outra coluna. Ele suspende determinados eventos de atualizao de serem elevados (eventos que so freqentemente usados para validao).
Aps a concluso de uma atualizao, voc pode reativar a restrio de verificao, que tambm reativa eventos de atualizao e os aumenta. Observao No Windows Forms, a arquitetura de vinculao de dados incorporados ao DataGrid suspende a restrio de verificao at que o foco mova para fora de uma linha e voc no precisa chamar explicitamente os mtodos BeginEdit, EndEdit ou CancelEdit. Restries so automaticamente desativadas quando o mtodo Merge chamado em um dataset. Quando a mesclagem estiver concluda, se houver qualquer restrio sobre o dataset que no possa ser ativado, ento uma ConstraintException ser lanada. Nesta situao, a propriedade EnforceConstraints definida para false e todas as violaes de restrio devem ser resolvidas antes de redefinir a propriedade EnforceConstraints para true. Aps a concluso de uma atualizao, voc pode reativar a restrio de verificao, que tambm reativa eventos de atualizao e os aumenta. Para obter mais informaes sobre suspenso de eventos, consulte Como: desativar restries ao preencher um DataSet. Erros de Atualizao de DataSet Quando voc atualiza um registro em um dataset, h a possibilidade de um erro. Por exemplo, voc pode inadvertidamente gravar dados em uma coluna que do tipo de dados errado ou muito longo ou que tenha algum outro problema de integridade. Alm disso, voc pode ter verificaes de validao especficas do aplicativo que podem elevar a erros personalizados durante qualquer estgio de um evento de atualizao. Para obter mais informaes, consulte Viso geral sobre validao de dados. Manter Informaes Sobre Alteraes As informaes sobre as alteraes em um dataset so mantidas de duas maneiras: por sinalizar a linha que indica se ele foi alterado (RowState) e por manter vrias cpias de um registro (DataRowVersion). Usando essas informaes, processos podem determinar o que foi alterado no dataset e podem enviar atualizaes apropriadas para a fonte de dados.
Propriedade RowState
A propriedade RowState de um objeto DataRow um valor que fornece informaes sobre o status de uma linha especfica de dados. A tabela a seguir detalha os possveis valores da enumerao DataRowState: Descrio
Valor de
Visual C# Consolidado
975
DataRowState Added A linha foi adicionada como um item a um DataRowCollection. (Uma linha nesse estado no tem uma verso original correspondente desde que no existia no momento que o ltimo mtodo AcceptChanges foi chamado). A linha foi excluda usando o Delete de um objeto DataRow. A linha tinha sido criada mas no faz parte de qualquer DataRowCollection. Um objeto DataRow est neste estado imediatamente aps ele ter sido criado e antes de ser adicionado a uma coleo ou se ele tiver sido removido de uma coleo. Um valor de coluna na linha foi alterado de alguma maneira. A linha no foi alterada desde que AcceptChanges foi chamado pela ltima vez.
Deleted Detached
Modified Unchanged
Enumerao DataRowVersion
Datasets mantm vrias verses de registros. A enumerao DataRowVersion de um objeto DataRow um valor que pode ser usado para retornar uma verso especfica de um objeto DataRow. A tabela a seguir detalha os possveis valores da enumerao DataRowVersion: Valor de DataRowVersion Current
Descrio A verso atual de um registro contm todas as modificaes executadas no registro desde a ltima vez que AcceptChanges foi chamado. Se a linha foi excluda no h verso atual. O valor padro de um registro, conforme definido pelo esquema do dataset ou fonte de dados. A verso original de um registro uma cpia do registro como ele nas ltimas alteraes foram confirmadas no dataset. Em termos prticos, isso normalmente a verso de um registro como lida de uma fonte de dados. A verso de um registro que est disponvel temporariamente, enquanto voc est no meio de uma atualizao ou seja, entre o momento voc chamou o mtodo BeginEdit e o mtodo EndEdit. Voc normalmente acessa a verso de um registro em um manipulador para um evento como RowChanging. Chamar o mtodo CancelEdit inverte as alteraes e exclui a verso da linha de dados proposta.
Default
Original
Proposed
Visual C# Consolidado
976
As verses originais e atuais so teis quando informaes de atualizao so transmitidas para uma fonte de dados. Normalmente, quando uma atualizao enviada para a fonte de dados, as novas informaes para o banco de dados esto na verso atual de um registro. Informaes da verso original so usadas para localizar o registro para atualizar. Por exemplo, no caso onde a chave primria de um registro for alterada, voc deve ter uma maneira de localizar o registro adequado em uma fonte de dados, para atualizar as alteraes. Se nenhuma verso original existisse, o registro provavelmente seria anexado fonte de dados, resultando no apenas em um registro extra indesejado, mas em um registro que est impreciso e desatualizado. As duas verses tambm so usados no controle de simultaneidade; voc pode comparar a verso original contra um registro na fonte de dados para determinar se o registro foi alterado desde que foi carregado no dataset. Para obter mais informaes, consulte Controle de concorrncia no ADO.NET. A verso proposta til quando voc precisa realizar validao antes de realmente confirmar as alteraes para o dataset. Mesmo se registros tiverem sido alterados, no h sempre verses originais ou atuais de linha. Quando voc insere uma nova linha na tabela, no h nenhuma verso original, somente a verso atual. Da mesma forma, se voc excluir uma linha, chamando o mtodo Delete da tabela, h uma verso original, mas nenhuma verso atual. Voc pode testar para ver se uma verso especfica de um registro existe consultando a propriedade HasVersion de uma linha de dados. Voc pode acessar tanto a verso de um registro, passando um valor de enumerao DataRowVersion como um argumento opcional quando voc solicitar o valor de uma coluna. Obter Registros Alterados comum que voc no atualize cada registro em um dataset. Por exemplo, um usurio pode estar funcionando com um controle Windows Forms DataGridView que exibe vrios registros. Entretanto, o usurio pode atualizar apenas alguns registros, excluir um, e inserir um novo nome. Datasets e tabelas de dados fornecem um mtodo (GetChanges) para retornar somente as linhas que foram modificadas Voc pode criar subconjuntos de registros alterados usando o mtodo GetChanges de uma tabela de dados (GetChanges) ou do DataSet prprio (GetChanges). Se voc chamar o mtodo para a tabela de dados, ela retornar uma cpia da tabela com apenas os registros alterados. Da mesma forma, se voc chamar o mtodo no dataset, voc ter um novo dataset com apenas registros alterados. GetChanges por si s retornar todos os registros alterados. Em contraste, passando o desejado DataRowState como um parmetro para o mtodo GetChanges, voc pode especificar o subconjunto de registros alterados que voc deseja: registros recm-adicionados, registros marcados para excluso, registros separados, ou registros modificados. Obter um subconjunto de registros alterados especialmente til quando voc deseja enviar registros para outro componente para processamento. Em vez de enviar o dataset inteiro, voc pode reduzir a sobrecarga de se comunicar com o outro componente por meio somente os registros que o componente precisa. Para obter mais informaes, consulte Como: Recuperar Linhas Alteradas. Confirmar Alteraes no DataSet Como as alteraes so feitas no dataset, a propriedade RowState de linhas alteradas est definida. As verses originais e atuais de registros so estabelecidas e mantidas e disponibilizadas para voc pela propriedade RowVersion. Os metadados armazenados nessas propriedades representam as alteraes que so necessrias para enviar as atualizaes adequadas para a fonte de dados.
Visual C# Consolidado
977
Se as alteraes refletem o estado atual da fonte de dados, voc no mais precisa manter essas informaes. Normalmente, existem duas vezes quando o dataset e sua fonte esto em sincronizao:
Imediatamente aps voc ter carregado informaes para o dataset, como quando voc l dados da fonte. Aps enviar alteraes do dataset para a fonte de dados (mas no antes, porque voc pode perder as informaes necessrias para enviar alteraes para o banco de dados).
Voc pode confirmar as alteraes pendentes para o dataset chamando o mtodo AcceptChanges. Normalmente, AcceptChanges deve ser chamado nos prximos momentos em seu aplicativo.
Depois que voc carregou o dataset. Se voc carregar um dataset chamando o mtodo Fill do TableAdapter, ento o adaptador confirma automaticamente as alteraes para voc. Entretanto, se voc carregar um dataset, mesclando outro dataset para ele, ento voc ter que confirmar as alteraes manualmente. Observao Voc pode impedir que o adaptador confirme automaticamente as alteraes ao chamar o mtodo Fill, definindo a propriedade AcceptChangesDuringFill do adaptador para false. Se ele estiver definido para false, ento o RowState de cada linha inserida durante o preenchimento definido como Added
Aps voc ter enviado alteraes do dataset para outro processo, como um XML Web Service. Cuidado Confirmar a alterao dessa maneira apaga qualquer mudana da informao. No confirmar alteraes at depois que voc tiver efetuado quaisquer operaes no qual seu aplicativo depende em saber quais alteraes foram feitas no dataset.
Grava a verso de um registro Current em sua verso Original, substituindo a verso original. Remove qualquer linha cuja propriedade RowState definida como Deleted. Define a propriedade de um registro RowState para Unchanged.
O mtodo AcceptChanges est disponvel em trs nveis. Voc pode cham-lo em um objeto DataRow, que confirma as alteraes para apenas aquela linha. Voc tambm pode cham-lo em um objeto DataTable para confirmar todas as linhas em uma tabela ou no objeto DataSet para confirmar todas as alteraes pendentes em todos os registros de todas as tabelas do dataset. A tabela a seguir descreve quais alteraes so confirmadas com base em qual objeto o mtodo chamado. Mtodo Resultado
Visual C# Consolidado
978
DataRow.AcceptChanges
Alteraes so confirmadas somente sobre a linha especfica Alteraes so confirmadas em todas as linhas na tabela especfica Alteraes so confirmadas em todas as linhas em todas as tabelas do dataset
DataTable.AcceptChanges
DataSet.AcceptChanges
Observao Se voc carregar um dataset chamando o mtodo Fill do TableAdapter, voc no tem que explicitamente aceitar alteraes; por padro o mtodo Fill chama o mtodo AcceptChanges quando ele tiver terminado de preencher a tabela de dados. Um mtodo relacionado, RejectChanges, desfaz o efeito das alteraes por copiar a verso de volta Original para a verso Current dos registros e configurar o RowState de cada registro de volta a Unchanged. Validao de Dados A fim de verificar que os dados em seu aplicativo atendem aos requisitos dos processos que passado, voc freqentemente precisa adicionar validao. Isso pode envolver verificao que uma entrada do usurio em um formulrio est correta, validao de dados enviados para seu aplicativo por outro aplicativo ou mesmo verificar que informaes calculadas no seu componente se enquadra nas restries de sua fonte de dados e aplicativos requeridos. Voc pode validar dados de vrias maneiras:
Na camada comercial, adicionando o cdigo a seu aplicativo para validar dados. O dataset um local que voc pode fazer isso. O dataset fornece algumas das vantagens de validao back-end como a capacidade para validar alteraes como valores de coluna e linha alteradas. Para obter mais informaes, consulte Viso geral sobre validao de dados. Na camada de apresentao, adicionando validao a formulrios. Para obter mais informaes, consulte User Input Validation in Windows Forms (Windows Forms). No back-end de dados, enviando dados para a fonte de dados por exemplo, o banco de dados e permitindo que ele aceite ou rejeite os dados. Se voc estiver trabalhando com um banco de dados que tem recursos sofisticados para validao de dados e fornecimento de informaes de erro, isso pode ser uma abordagem prtica porque voc pode validar os dados no importando de onde ele vem. Entretanto, ele pode no acomodar requisitos especficos de aplicativo de validao. Alm disso, tendo a fonte de dados validada, dados podem resultar em vrias viagens fonte de dados, dependendo de como seu aplicativo facilita em resolver erros de validao elevados pelo back-end. Observao de segurana Ao usar comandos de dados com uma propriedade CommandType definida como Text, cuidadosamente verifique informaes que so enviadas de um cliente antes de pass-la para seu banco de dados. Usurios mal intencionados podem tentar para enviar (inserir) instrues SQL modificadas ou adicionais em um esforo para obter acesso no autorizado ou danificar o
Visual C# Consolidado
979
banco de dados. Antes de voc transferir a entrada do usurio a um banco de dados, voc deve verificar se as informaes so vlidas; a melhor prtica para sempre usar consultas parametrizadas ou procedimentos armazenados quando possvel. Para obter mais informaes, consulte Viso Geral Sobre Scripts Maliciosos. Aps terem sido feitas alteraes em um dataset, voc pode transmitir as alteraes em uma fonte de dados. Mais comumente, faa isso chamando o mtodo Update de um TableAdapter (ou adaptador de dados). O mtodo loops a cada registro em uma tabela de dados, determina que tipo de atualizao necessria (atualizar, inserir ou excluir), se houver, e, ento, executa o comando apropriado. Como Uma Atualizao Transmitida Fonte de Dados Como uma ilustrao da como atualizaes so feitas, suponha que o seu aplicativo utilize um dataset contendo uma nica tabela de dados. O aplicativo busca duas linhas do banco de dados. Aps a recuperao, a tabela de dados na memria tem esta aparncia:
(RowState) CustomerID Name Status (Unchanged) c200 Robert Lyon Good (Unchanged) c400 Nancy Buchanan Pending
Seu aplicativo altera o status de Nancy Buchanan para " Preferred ". Como resultado desta alterao, o valor da propriedade RowState para aquela linha altera de Unchanged para Modified. O valor da propriedade RowState para a primeira linha permanece Unchanged. A tabela de dados agora tem esta aparncia:
(RowState) CustomerID Name Status (Unchanged) c200 Robert Lyon Good (Modified) c400 Nancy Buchanan Preferred
Seu aplicativo agora chama o mtodo Update para transmitir o dataset para o banco de dados. O mtodo inspeciona cada linha por vez. Para a primeira linha, o mtodo no transmite Instruo SQL para o banco de dados, porque essa linha no foi alterada desde que foi originalmente procurada no banco de dados. Para a segunda linha, no entanto, o mtodo Update automaticamente chama o comando de dados adequado e o transmite para o banco de dados. A sintaxe especfica da instruo SQL depende do dialeto do SQL suportado para o armazenamento de dados subjacente. Mas os seguintes traos gerais de instruo do SQL transmitidos so os que valem a pena observar:
A instruo SQL transmitida uma declarao UPDATE. O adaptador sabe usar uma propriedade UPDATE, porque o valor da propriedade RowState Modified. A instruo SQL transmitida inclui uma clusula WHERE indicando que o destino da declarao UPDATE a linha cujo CustomerID = 'c400'. Esta parte da declarao SELECT distingue a linha de destino de todas as outras porque CustomerID a chave primria da tabela de destino. As informaes para a clusula WHERE so derivadas da verso original do registro (DataRowVersion.Original), no caso de os valores necessitarem identificar a linha que foi alterada. A instruo SQL transmitida inclui a clusula SET, para definir os novos valores das colunas modificadas. Observao Se a propriedade UpdateCommand do TableAdapter tiver sido definida com o nome de um
Visual C# Consolidado
980
procedimento armazenado, o adaptador no constri uma instruo SQL. Em vez disso, ele chama o procedimento armazenado com os parmetros apropriados passados. Passando Parmetros Valores de registros a serem atualizados no banco de dados so passados usando parmetros. Quando o mtodo Update do TableAdapter executa uma declarao UPDATE, ele precisa preencher os valores de parmetro. Ele obtm esses valores da coleo Parameters para o comando de dados apropriados neste caso, o objeto UpdateCommand na TableAdapter. Se voc tiver usado ferramentas do Visual Studio para gerar um adaptador de dados, o objeto UpdateCommand conter um conjunto de parmetros que corresponde a cada espao reservado do parmetro na declarao. A propriedade SqlParameter.SourceColumn de cada parmetro aponta para uma coluna na tabela de dados. Por exemplo, a propriedade SourceColumn para os parmetros au_id e Original_au_id estiverem definidos como qualquer coluna na tabela de dados contm o autor do ID. Quando o adaptador do mtodo Update executa, ele l o autor coluna ID do registro sendo atualizado e preenche os valores na declarao Em uma declarao UPDATE, voc precisa especificar os dois novos valores (aqueles que sero gravados para o registro), bem como os antigos valores (para que o registro a ser atualizado possa estar localizado no banco de dados). H, portanto, dois parmetros para cada valor: um para a clusula SET e um cone diferente para a clusula WHERE. Os dois parmetros lem dados do registro sendo atualizado, mas eles obtm verses diferentes do valor da coluna com base no parmetro da propriedade SqlParameter.SourceVersion. O parmetro para a clusula SET obtm a verso atual e o parmetro para a clusula WHERE obtm a verso original. Observao Voc tambm pode definir valores na coleo Parameters no cdigo, que normalmente voc deseja fazer em um manipulador de eventos para o adaptador de dados do evento RowChanging. Para obter mais informaes, consulte Parmetros de comandos Adapter Data-. Atualizando Tabelas Relacionadas Se o dataset contiver vrias tabelas, voc precisa atualiz-las individualmente chamando o mtodo Update de cada adaptador de dados separadamente. Se as tabelas tm uma relao paifilho, provvel que voc ter que enviar atualizaes para o banco de dados em uma ordem especfica. Um cenrio comum que voc adicionou pai e o filho relacionado gravados para um dataset por exemplo, um novo registro do cliente e um ou mais registros relacionados. Se o prprio banco de dados est impondo regras de integridade relacional, ele aumentar erros se voc enviar o novo registro filho para o banco de dados antes que o registro pai tiver sido criado. Inversamente, se voc excluir registros relacionados no dataset, geralmente voc ter para que atualizaes na ordem inversa: tabela filho primeiro, depois tabela pai. Caso contrrio, provvel que o banco de dados que gere um erro porque as regras de integridade referencial impediro voc de excluir um registro pai enquanto ainda existem registros filho relacionados.
de concorrncia no
ADO.NET
Visual C# Consolidado
981
Controle concorrente o processo usado para identificar e resolver atualizaes dos dados que so feitas por vrios usurios simultaneamente. Os tpicos a seguir explicam mtodos comuns para controle concorrente, bem como recursos ADO.NET especficos para manipular erros concorrentes. as relacionadas a seguir nesta ordem: 1. 2. 3. 4. Tabela filho: excluir registros. Tabela pai: inserir, atualizar e excluir registros. Tabela filho: inserir e atualizar registros. Para obter mais informaes, consulte Passo-a-Passo: salvando dados a um banco de dados (vrias tabelas).
Controle de Concorrncia Como datasets so desconectados da fonte de dados, no mantenha bloqueios em registros na fonte de dados. Portanto, se voc deseja atualizar o banco de dados, e se ele for importante para seu aplicativo para manter controle de simultaneidade, voc deve reconciliar registros no dataset com aqueles no banco de dados. Por exemplo, voc pode localizar registros no banco de dados que foram alterados desde o ltimo preenchimento do dataset. Nesse caso, voc deve executar aplicao-apropriada lgica para especificar o que acontece com o registro de banco de dados ou com o registro alterado que voc tem em sua dataset. Para obter mais informaes, consulte Controle de concorrncia no ADO.NET.
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
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.
Visual C# Consolidado
985
As tentativas do exemplo a seguir, atualiza uma fonte de dados com o contedo do NorthwindDataSet em um bloco try/catch, se um erro for gerado uma mensagem de erro exibida junto com a primeira coluna da linha de dados afetada. Observao O cdigo abaixo uma ilustrao de uma estratgia para tratar um erro de atualizao do banco de dados. O cdigo pressupe vrias coisas; uma conexo existente para um banco de dados, a existncia de um dataset, bem como a suposio que o comando de execuo da atualizao ser gerado numa violao de concorrncia. Para obter mais informaes e um exemplo completo, consulte Passo a passo: Manipulando uma exceo de concorrncia. Para resolver uma violao de concorrncia 1. 2. 3. Execute o comando para atualizar o banco de dados de dentro de um bloco try/catch. Se uma exceo gerada, inspecione a declarao catch da propriedade Row para determinar o que causou a violao. Adicione cdigo para resolver o erro com base nas regras de negcio do aplicativo. O cdigo a seguir usa o CustomersTableAdapter e o NorthwindDataSet, como exemplos do adaptador e do dataset em seu aplicativo. C#
try { customersTableAdapter.Update(northwindDataSet); } catch (DBConcurrencyException ex) { string customErrorMessage; customErrorMessage = "Concurrency violation\n"; customErrorMessage += ex.Row[0].ToString(); // Add business logic code to resolve the concurrency violation... }
7.
Visual C# Consolidado
986
Acesso ao banco de dados de exemplo Northwind com permisso para executar atualizaes. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Observao
As caixas de dilogo e comandos de menu que voc v podem diferir das descritas na Ajuda dependendo de suas configuraes ativas. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Criar um novo projeto Voc comear com a explicao passo a passo de como criar um novo aplicativo do Windows.
Visual C# Consolidado
987
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.
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(); }
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; }
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.
Visual C# Consolidado
990
8. 9.
No primeiro registro no formulrio (ALFKI), altere o ContactName para Maria Anders1. Clique no boto Save. O erro de concorrncia gerado, e a caixa de mensagem aparece.
10. Clicar em No cancela a atualizao e atualiza o dataset com os valores correntes no banco de dados, enquanto clicar em Yes grava o valor proposto para o banco de dados. Consulte tambm
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
Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um Aplicativo Windows
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.
No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. OuSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Region, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Region aparece na janela Data Sources. Adicionar controles ao formulrio para exibir os dados
5. 6. 7. 8.
Criar os controles com dados vinculados, arrastando itens da janela Data Sources para seu formulrio.
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.
Visual C# Consolidado
992
Executando 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
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
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
Visual C# Consolidado
998
Aps criar o novo projeto SQL Server, a Add Database Reference Dialog Box exibida. Use esta caixa de dilogo para adicionar uma referncia do banco de dados, ou conexo, para o projeto. Voc pode selecionar um referncia do banco de dados que est disponvel no momento no Server Explorer/Database Explorer ou definir uma nova conexo. Somente uma referncia do banco de dados pode ser adicionada ao projeto.
Propriedades do projeto
Voc pode alterar o Assembly name, que o nome do arquivo de sada que contm o manifesto do assembly. Se voc alterar o nome do assembly, o nome do objeto do banco de dados no banco de dados do SQL Server tambm alterado. Adicionando itens ao projeto Novos projetos SQL Server contm somente referncias e informaes de assembly. Para criar objetos de banco de dados, voc deve primeiro adicionar itens ao projeto e depois adicionar cdigo aos itens. Para obter mais informaes, consulte Modelos de Item para Projetos do SQL Server. A tabela a seguir lista itens especficos para projetos SQL Server que voc pode adicionar. Item Procedimento armazenado Mais informaes Como: criar e executar um procedimento armazenado SQL Server CLR Como: Criar e Executar um Disparador SQL Server CLR Como criar e executar um SQL CLR Server funo definida pelo usurio: Como criar e executar um SQL CLR Server funo definida pelo usurio: Como criar e executar uma agregao ao CLR do SQL Server:
Agregado
Compilando, implantando e depurando Quando voc compila seu projeto, ele compilado em um assembly que pode ser implantado em um banco de dados que est referenciado no projeto e depurado. Dica Como uma alternativa a compilar, implantar e depurar em trs etapas separadas, voc pode usar o comando Start (F5) ou o comando Start Without Debugging (CTRL+F5) para compilar o assembly, implant-lo no banco de dados e depurar o objeto de banco de dados. Antes de voc poder depurar o objeto de banco de dados, voc deve adicionar cdigo TransactSQL ao item Test.sql. O script no item Test.sql essencial para a depurao porque ele executa as aes no banco de dados que so necessrias para iniciar e testar seu objeto de banco de
Visual C# Consolidado
999
dados. Quando ele adicionado ao seu projeto, o item Test.sql contm esboo de cdigo para um script que executa a ao necessria no banco de dados. Se seu projeto SQL Server contm mais de um objeto de banco de dados, o script do item Test.sql deve executar cada um dos objetos de banco de dados. Esse requisito de script de depurao diferente de, por exemplo, um projeto do Windows Forms, que cria e executa um programa executvel independente; objetos de banco de dados so executados apenas em resposta a aes ou chamadas no banco de dados. Por exemplo, um disparador pode ser ativado quando uma nova linha inserida em uma tabela. Portanto, o script de Test.sql deve inserir uma nova linha em uma tabela para ativar o disparador. Os resultados do disparador sero exibidos na Output Window no Visual Studio, para que voc possa determinar se o disparador est funcionando corretamente. Em seguida, adicione cdigo ao item que voc adicionou no seu projeto SQL Server e ao item Test.sql. Voc pode encontrar cdigo de exemplo para cada objeto de banco de dados em tpicos sobre o item de banco de dados disponvel. Consulte a tabela anterior.
Para implantar um assembly do SQL Server Class Library em Visual C# ou Visual J# Visual C# Consolidado 1000
1. 2.
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
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
1. 2.
No menu File, crie um novo projeto. Selecione SQL Server Project, nomeie o projeto SQLCLRStoredProcedure e clique em OK. Para obter mais informaes, consulte Como: criar um projeto SQL Server. Conectando-se a um banco de dados SQL Server 2005
Esta explicao passo a passo requer uma conexo para o banco de dados de exemplo AdventureWorks executando em SQL Server 2005. Se uma conexo com o banco de dados de exemplo AdventureWorks estiver disponvel no Server Explorer, ento ele ser listado na Add Database Reference Dialog Box. Observao O recurso de integrao do common language runtime (CLR) fica desativado por padro no Microsoft SQL Server e deve ser ativado para usar itens de projeto de SQL Server. Para ativar integrao CLR, use a opo clr enabled do procedimento armazenado sp_configure. Para mais informaes, consulte Enabling CLR Integration.
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
1. 2.
No Solution Explorer, expanda a pasta TestScripts e clique duas vezes no arquivo Test.sql. Substitua o cdigo no arquivo Test.sql com o seguinte cdigo:
EXEC InsertCurrency 'AAA', 'Currency Test' SELECT * from Sales.Currency where CurrencyCode = 'AAA'
3.
Pressione F5 para criar, implantar e depurar o procedimento armazenado. Para informaes sobre como implantar sem depurao, consulte Como implantar SQL itens Project Server em um SQL Server:. Veja os resultados na janela Output e selecione Show output from: Database Output.
Visual C# Consolidado
1003
Class Enumerao Interface Classe abstrata Estrutura Delegado Module (Visual Basic somente)
Para exibir tipos existentes em um projeto, consulte COMO: Exibir tipos existentes. Para criar um tipo em um diagrama de classe 1. A partir do projeto no Solution Explorer, abra um arquivo diagrama de classe (.CD). Dica Se o projeto no contm um arquivo diagrama de classe, voc deve adicionar um. Para obter mais
Visual C# Consolidado
1004
informaes, consulte COMO: Adicionar diagramas de classes a projetos. 2. Abrir Caixa de ferramentas Class Designer clicando na Toolbox guia. Dica Para manter a caixa de ferramentas aberta enquanto voc trabalha no Class Designer, clique no Auto Hide boto (de pino de envio) na caixa de ferramentas. 3. Na caixa de ferramentas Class Designer, arraste uma forma tipo para o diagrama de classe. Caixa New <Type> de dilogo aparecer para que voc pode especificar o nome do tipo, o nome do arquivo para salvar o cdigo para o tipo, e o nvel de acesso para o tipo. Identifica <Type> o tipo que voc est criando, tais como Class ou Enumeration. 4.
o o
Na caixa New <Type> de dilogo, execute uma das opes a seguir: Para aceitar os valores padro, clique em OK. Para especificar valores diferentes, digite o nome e nome de arquivo para o tipo, escolha o nvel de acesso para o tipo na caixa Access de listagem, e clique em OK. Dica Para selecionar um arquivo existente, clique no ellipsis. () boto ao lado da File name Caixa
5.
A forma que representa o tipo aparece no diagrama na posio onde voc arrastado-lo. Se voc especificou um novo nome de arquivo Visual Studio cria um arquivo cdigo fonte com o nome do tipo no n de projeto em Solution Explorer. Se voc escolher um arquivo existente, Visual Studio adiciona o cdigo para o novo tipo ao arquivo especificado.
Visual C# Consolidado
1005
Enum Struct
Membro Mtodo, campo de propriedade (para C# e Visual Basic), evento (para C# e Visual Basic), (mtodo) construtor, constante mtodo, evento (para C# e Visual Basic), propriedade Mtodo, Campo (para J#)
Interface
Delegado Observao
Parmetro
O nico tipo para o qual voc pode especificar parmetros delegado. Voc pode especificar parmetros para mtodos, que por sua vez pode ser adicionado aos tipos para classe, estrutura, e interface; para obter mais informaes consulte COMO: Adicionar um parmetro a um mtodo.
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.
Clique com o boto direito do mouse a superfcie de um diagrama de classe para exibir um menu de contexto. No menu de contexto, clique em Class Details Window.
Consulte tambm
Visual C# Consolidado
1007
Clicar em qualquer clula editvel permite que voc editar o contedo da clula. Suas alteraes so refletidas em todos os locais que dados so armazenados ou exibido, incluindo na janela Propriedades do e no cdigo fonte. Clicar em qualquer clula de uma linha faz a janela Propriedades para exibir as propriedades para o elemento representados por aquela linha. Para alterar a largura de uma coluna, arraste o limite no lado direito do cabealho da coluna at que a coluna esteja da largura desejada. Voc pode expandir ou recolher compartimento ou ns propriedade clicando no sinal de mais ou menos smbolo esquerda da linha. A janela Detalhes de classe oferece vrios botes para criar novos membros da classe atual e para navegar entre os membros dos compartimentos na grade da janela Detalhes classe. Para obter mais informaes, consulte botes janela Detalhes classe.
Usando o teclado Observao Os acoplamentos de teclas a seguir foram escolhidos para especificamente para imitar a experincia de digitar cdigo. Use estas teclas para navegar a janela Detalhes classe: Chave (vrgula) Resultado Se o cursor estiver em uma linha de parmetro, digitar uma vrgula Move o cursor para o campo Nome do parmetro prximo. If the cursor is in the last parameter row of a method, it moves the cursor to the <add parameter> field, which you can use to create a new parameter. Literalmente se o cursor est em outro lugar na janela Detalhes classe, digitar uma vrgula adicionar uma vrgula no campo atual. Mova o cursor para o campo Nome da prxima linha na grade da janela Detalhes classe Membro.
Move o cursor para o campo prximo, primeiro mover da esquerda para direita e ento superior para baixo. Se o cursor est movendo de um campo em que voc digitou texto, janela Detalhes classe processa esse texto e o armazena se ele no produz um erro. If the cursor is on an empty field such as <add parameter>, Tab moves it to the first field of the next row. Move o cursor para o campo prximo, primeiro mover da esquerda para direita e ento superior para baixo. If the cursor is on an empty field such as <add parameter>, it moves to the first field of the next row. Note that <space> typed immediately after a comma is ignored. Se o cursor for no campo Resumo, digitar um espao adicionar um caractere de espao. Se o cursor est na coluna de uma linha determinada, ocultar digitar um espao alternar o valor na caixa de seleo Ocultar. Alterna para outra janela do documento. Por exemplo, alterne da janela Detalhes classe para um arquivo de cdigo aberto.
CTRL + TAB
ESC (ESCAPE) Se voc tiver comeado digitar texto em um campo, pressionando ESC atua
Visual C# Consolidado
1008
como uma chave de desfazer, revertendo o contedo do campo para o valor anterior. Se a janela Detalhes classe tem foco geral, mas nenhuma clula especfica tiver foco, pressionar ESC move o foco fora da janela Detalhes classe. Seta superiores Essas chaves mova o cursor de linha para outra verticalmente na grade da e inferiores seta janela Detalhes classe. Seta esquerda Seta direita Se o cursor for na coluna Nome, pressionar a seta esquerda recolhe o n atual na hierarquia (se ele estiver aberto). Quando o cursor est na coluna Nome, pressionando na SETA PARA DIREITA expande o n atual na hierarquia (se ele estiver recolhido).
O tipo inteiro somente leitura, quando, por exemplo, ele reside em um conjunto de referncia (consulte Exibio de informaes somente leitura.) Quando voc seleciona a forma no Class Designer, a janela Detalhes classe exibe seus detalhes em um estado somente leitura. Para indexadores, o nome somente leitura e o restante (tipo, modificador, Resumo) editvel. Todos os generics ter parmetros somente leitura na janela Detalhes classe. Para alterar um parmetro genrico, edite o cdigo fonte. O nome do parmetro do tipo que definido em um tipo genrico somente leitura. Quando cdigo Um do tipo interrompido (no analisvel), janela Detalhes classe exibe contedo do tipo como somente leitura. Voc pode exibir cdigo fonte clicando com o boto direito do mouse uma forma na janela Detalhes classe (ou o Class Designer) e, em seguida, clicando em Exibir cdigo. O arquivo de cdigo de fonte abre e rola para o elemento selecionado. Imediatamente Alterar cdigo fonte ser refletida na exibio de informaes de assinatura no Class Designer e a janela Detalhes classe. Se a janela Detalhes classe fechada ao tempo, as novas informaes estar visveis na prxima vez que abri-lo. Quando cdigo Um do tipo interrompido (no analisvel), janela Detalhes classe exibe contedo do tipo como somente leitura.
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
Um projeto que contm um diagrama de classe Um projeto referenciado a partir de um projeto que contm um diagrama de classe Um conjunto de mdulos (assembly) referenciado a partir de um projeto que contm um diagrama de classe
Nos dois ltimos casos, a entidade de referncia (um tipo ou membro) somente para leitura no diagrama de classe que representa. Um projeto inteiro ou partes dele, tais como arquivos individuais, podem ser somente leitura. Os casos mais comuns em que um projeto ou um de seus arquivos somente leitura so quando ele est sob controle Cdigo fonte-(e possvel check-out), ele existe em um conjunto externo, ou quando o sistema operacional considera os arquivos para ser somente leitura. Controle Code origemComo um diagrama de classe salvo como um arquivo em um projeto, voc precisa fazer checkout do projeto para salvar as alteraes feitas na Class Designer ou na janela Detalhes classe. Se voc no faa check-out do projeto, voc pode ainda salvar um diagrama de classe que descreve o projeto, mas no como parte do projeto. Projetos somente leitura O projeto pode ser somente leitura por uma razo diferente de controle cdigo fonte-. Fechar o projeto exibe uma caixa de dilogo perguntando se deve substituir o arquivo de projeto, descartar alteraes (no salvar) ou cancelar a operao de fechamento. Se voc optar por substituir, arquivos de projeto so sobrescritos e feita somente leitura. O novo arquivo diagrama de classe for adicionado. Tipos somente leitura Se voc tentarem salvar um projeto contendo um tipo cujo arquivo cdigo-fonte somente para leitura, caixa Save of Read-Only File de dilogo aparece, que oferece opes para salvar o arquivo com um novo nome ou novo local, ou para substituir o arquivo somente leitura. Se voc substituir o arquivo, a nova cpia mais somente leitura. Se um arquivo de cdigo contm um erro de sintaxe, formas Exibir cdigo no arquivo sero somente leitura-temporariamente at ser corrigido o erro de sintaxe. Formas de nesse estado exibir texto vermelho e um cone vermelho que exibe uma dica de ferramenta ler " O arquivo cdigo fonte contm um erro de anlise ". Um tipo referenciado (como um tipo .NET Framework), que existe em outro n de projeto ou em um n conjunto referenced-, indicado na superfcie de design Class Designer como somente leitura. Um tipo local, que existe no projeto voc tenha aberto, leitura-gravao, e sua forma sobre o Class Designer superfcie do design indicada as such. Indexadores so de leitura-gravao em cdigo e janela Detalhes classe, mas o indexador nome somente leitura.
Visual C# Consolidado
1010
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.
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
Linhas de parmetro
Parmetros de um membro so agrupados juntos nas linhas imediatamente sob o membro ao qual eles se aplicam. Linhas parmetro conter os seguintes itens:
Parameter Icon Trs tipos de cones aparecem esquerda de linhas de parmetro: An opening parenthesis '(' indicates the first parameter of a member. Um parntese de fechamento ') '. indica a linha aps o ltimo parmetro do membro Esta linha contm as palavras <add parameter>. Um separador de parmetro (. ', ') aparece esquerda de cada parmetro aps a primeira que uma vrgula, Parameter Name A Name coluna em uma linha de parmetro exibe o nome do parmetro. Este nome tambm exibido na propriedade Name na janela Propriedades. Voc pode usar essa clula para alterar o nome de qualquer parmetro com permisses somente leitura. Apontando para o nome do parmetro exibe o nome do parmetro se a Name coluna muito estreita para mostrar o nome completo.
o o o
Parameter Type A Parameter Type clula usa IntelliSense, que permite que voc escolha em uma lista de todos os tipos disponveis no projeto atual ou projetos referenciados.
Parameter Modifier A Modifier clula em uma linha de parmetro aceita e exibe o novo modificador do parmetro. Para usar a caixa de listagem drop-down para selecionar In, In/Out, insira um novo modificador de parmetro, e Out.
<add parameter> A ltima linha de parmetro de um membro contm o texto <add parameter> na clula Name. Permite que voc criar um novo parmetro clicando nesta clula. Para obter mais informaes, consulte COMO: Adicionar um parmetro a um mtodo.
Parameter properties in the Properties window A janela Propriedades exibe as mesmas propriedades de parmetro exibidas na janela Detalhes classe: Modifier., Name e Type Alterar uma propriedade em um local atualiza o valor da propriedade globalmente, incluindo a exibio de seu valor em outro local.
Visual C# Consolidado
1012
Observao Usando Class Designer, voc pode visualizar existentes tipos genricos, mas voc pode criar novos tipos genricos. Voc tambm no pode modificar parmetros tipo em existentes tipos genricos. Para herdar de um tipo genrico 1. 2. Na Toolbox, selecione a Inheritance linha. Na diagrama de classe, desenhe uma linha de herana do tipo derivado para o tipo base. (Neste procedimento, o tipo base um tipo genrico.) Uma linha de herana do tipo derivado apontando para o tipo base ser exibida na superfcie do design. A Linha de Herana obtm foco e sua exibio propriedades na janela Propriedades. A Type Arguments propriedade na janela Properties exibe valores padro para a linha de herana. Alterar o valor da propriedade Type Arguments para coincidir com os tipos desejados para o tipo derivado.
6.
Visual C# Consolidado
1013
ou campo de outra classe no projeto. Linhas de associao geralmente so usadas para ilustrar os relacionamentos entre classes no seu projeto mais importantes. Enquanto voc poderia exibir todos os campos e propriedades como associaes, faz mais sentido para mostrar somente os membros importantes como associaes, dependendo do que voc pretende enfatizar no diagrama. (Voc pode mostrar membros menos importantes membros como normais ou ocult-las totalmente.) Observao Class Designer oferece suporte somente associaes unidirecionais. Para definir um linha de associao no diagrama de classe 1. 2. Na caixa de ferramentas, selecione o Association item. Desenhar uma linha entre as duas formas voc deseja vincular com uma associao. Uma nova propriedade criada na primeira classe. Essa propriedade exibe como um linha de associao (no como uma propriedade em um compartimento na forma) com um nome padro. Seu tipo a forma para o qual a linha de associao aponta. Para alterar o nome de uma associao
- 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.
Visual C# Consolidado
1014
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.
Visual C# Consolidado
1016
diagramas no seu projeto. Para remover uma forma de um diagrama de classe 1. 2. Na diagrama de classe, selecione a forma tipo que deseja remover do diagrama. No menu Edit, escolha Remove from Diagram. A forma Tipo e nenhuma linha de associao ou herana conectado a forma mais aparecem no diagrama. Voc pode tambm selecione a forma e pressionar a tecla DELETE ou clique com o boto direito do mouse na forma e escolha Remove from Diagram.
Visual C# Consolidado
1017
2. 3.
Na forma tipo, clique no nome compartimento. No menu Class Diagram, escolha Hide Compartment. O compartimento est oculto dentro da forma tipo expandida.
Tambm pode clique com o boto direito do mouse no nome compartimento e escolha Hide Compartment a partir do menu de atalho. Voc tambm pode selecionar as caixas de seleo na coluna Hide da janela classe detalhes para todos os membros no compartimento para ocultar o compartimento Para obter mais informaes, consulte COMO: Abrir a janela Class Details. Para mostrar um compartimento 1. 2. Abrir ou exibir a janela Detalhes classe se ele estiver fechado. Na janela Class Details, desmarque a caixa de seleo na coluna Hide para o compartimento voc deseja mostrar. O compartimento e seus membros aparecem na forma tipo no diagrama de classe.
Visual C# Consolidado
1018
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.
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.
No Solution Explorer, clique com o boto direito do mouse no nome do projeto e execute uma das opes a seguir: Clique em Add New Item. Aponte para Add, e clique em New Item. A Add New Item caixa de dilogo ser exibida. No painel Modelos da caixa Add New Item de dilogo, execute uma das opes a seguir: Para criar um diagrama de classe com o nome padro, clique duas vezes Class Diagram. Para criar um diagrama de classe com outro nome, clique em Class Diagram, alterar o nome na caixa Name, e clique em Add. O diagrama de classe aberta no Class Designer e aparece como um arquivo com uma extenso.CD no Solution Explorer dentro da hierarquia do projeto. Caixa de ferramentas Class Designer aparece e contm formas e linhas voc pode arrastar para o diagrama.
2.
o o
3.
Para adicionar vrios diagramas de classe, repita as etapas no procedimento. Observao que voc tambm pode criar um diagrama de classe para sua soluo, clicando no Class Diagram boto no Solution Explorer, ou escolhendo View Class
Visual C# Consolidado
1020
Diagram dos menus de contexto de Class e Project Ns de Solution Explorer e Namespace. e Type Ns de Class View
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.
Visual C# Consolidado
1022
Para adicionar um comentrio 1. 2. Arraste um comentrio de at o diagrama de classe. o Class Designer Toolbox Clique no novo forma de comentrio no diagrama e digite o texto desejado.
Roteamento de linha manual. Primeiro, clique em um linha de associao para selecionlo. Em seguida, voc pode mover a linha, ou segmentos de linha, esquerda, direita, para cima, ou para baixo. Pontos de extremidade da linha permanecem ancorados nas formas se conecta. Posicionamento rtulo de linha associao. Primeiro, clique no rtulo de um linha de associao para selecion-lo. Em seguida, voc pode arrastar o rtulo para outra posio no diagrama. Ocultar linha de associao. Com o boto direito do mouse uma linha de associao exibe um menu de contexto. Em seguida, se voc clicar em Show as Property, a linha removida do diagrama, mas a associao aparecer como uma propriedade em uma forma. Consulte COMO: Alternar entre notao de membro e notao de associao. Mostrar e ocultar formas. Para ocultar forma um tipo, clique com o boto direito do mouse em sua rea de cabealho e clique em Remove from Diagram. Para mostr-la novamente, arraste-a para o diagrama de Class View. Mostrar e ocultar membros tipo. Usando o Class Designer ou janela Detalhes classe, voc pode mostrar membros um tipo ou ocult-las Para obter mais informaes, consulte COMO: Exibir membros de tipo. Expandir e recolher formas. Para recolher uma forma, clique com boto direito mouse sua rea de cabealho e clique em Collapse. Isso oculta todos os compartimentos a forma. Para expandir a forma, clique com o boto direito do mouse e clique em Expand. Expandir e recolher compartimentos forma. Para recolher um compartimento em uma forma, clique com o boto direito do mouse no rtulo compartimento e clique em Collapse. Para exibir o compartimento, clique na forma (para que ele foco) e desmarque caixas o compartimento Hide na janela Detalhes classe. Agrupar e classificar membros. Voc pode agrupar membros um tipo de vrias maneiras. Para obter mais informaes, consulte COMO: Agrupar membros de tipo.
Visual C# Consolidado
1023
Clique com boto direito mouse a forma e escolha Copy as Image. A forma colocada na rea de transferncia.
Para copiar vrios elementos 1. 2. Na superfcie do diagrama, arraste o ponteiro para selecionar as formas que voc deseja copiar. Clique com boto direito mouse uma das formas selecionadas e escolha Copy as Image. Todas as formas selecionadas so colocadas na rea de transferncia. Para copiar todos os elementos em um diagrama de classe 1. 2. Clique com o boto direito do mouse a superfcie de diagrama e escolha Select All. Clique no Copy cone na barra de ferramentas Padro, ou selecione Copy as image no menu Editar. Formas do todo o diagrama so colocadas na rea de transferncia. Depois voc copiados sua seleo, col-lo usando o Paste Comando no programa de destino. Programas orientado Text-exibir o cdigo por trs do forma selecionada ou formas, enquanto programas orientado a elementos grficos-exibir a imagem da forma ou formas que voc copiou. Observao Voc tambm pode escolher Copy em vez de Copy as Image. Copia Copy a imagem como um bitmap regular, e Copy as Image copia a imagem como uma imagem vetorial, que melhor para a maioria dos aplicativos do Office.
Visual C# Consolidado
1024
O mtodo base seja substitudo deve ser virtual, abstract, ou substituir. (Ele no pode ser no-virtual ou esttico.) 1. No diagrama de classe, clique com o boto direito do mouse em uma forma de classe, e escolha Intellisense DEPOIS Override Members. Ser exibida uma caixa de dilogo Exibir membros substituvel. 2. Na lista, escolha um membro. Um membro com o mesmo nome, modificador de acesso, valor de retorno, e assinatura aparecer como selecionado na classe, e sua Override propriedade definida como True.
Visual C# Consolidado
1025
Visual C# Consolidado
1026
O projeto contm uma classe abstrata. A classe abstrata contm membros abstratos. A classe abstrata a classe base em uma relao de herana com outra classe. (A classe derivada no precisa ser uma classe abstrata.) Clique com o boto direito a classe derivada em seguida, escolha Intellisense, escolha Implement Abstract Class. Todos os membros da classe base abstratos so implementados na classe derivada.
Visual C# Consolidado
1027
Voc tambm pode criar Construtores e destructors usando os procedimentos nesta seo. Lembre-se que Construtores e destructors so tipos especiais de mtodos, e como tal, so exibidos no Methods compartimento na formas diagrama de classe e na seo Methods de detalhes classe grade da janela. Observao A nica entidade voc pode adicionar a um delegado parmetro. Observe que o procedimento chamado ' para criar um membro usando a barra de ferramentas Janela detalhes classe ' no vlido para esta ao. Para criar um membro usando Class Designer 1. Clique com o boto direito do mouse o tipo ao qual voc deseja adicionar um membro, aponte para Add, e clique em Add <member>. A nova assinatura membro criado e adicionado ao tipo. fornecido um nome padro que voc pode alterar, na Class Designer janela Detalhes classe, ou na janela Propriedades. 2. 1. 2. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo. Na superfcie do diagrama, selecione o tipo ao qual voc deseja adicionar um membro. O tipo obtm foco e seu contedo so exibidos na janela Detalhes classe. Na barra de ferramentas Janela detalhes classe, clique no cone superior e selecione New <member> na lista drop-o. O cursor vai para o Name campo em uma linha para o tipo de membro que voc deseja adicionar. Por exemplo, se voc clicou em New Property, em uma nova linha na seo Properties da janela Detalhes classe mover o cursor. 3. Digite o nome do membro voc deseja criar e pressione ENTER (ou caso contrrio mover o foco, como pressionando TAB). A nova assinatura membro criado e adicionado ao tipo. O membro agora existe no cdigo e exibido no Class Designer, a janela Detalhes classe, e a janela Propriedades. 4. 1. 2. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo. Na superfcie do diagrama, selecione o tipo ao qual voc deseja adicionar um membro. O tipo obtm foco e seu contedo so exibidos na janela Detalhes classe. Na janela Detalhes classe, na seo que contm o tipo de membro voc deseja adicionar, clique em <add member>. Por exemplo, se voc deseja adicionar um campo, clique em <add field>. Digite o nome do membro voc deseja criar e pressione ENTER. A nova assinatura membro criado e adicionado ao tipo. O membro agora existe no cdigo e exibido na janela Detalhes classe, a Class Designer, o e a janela Propriedades. 4. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo. Voc Note: pode usar atalhos de teclado para criar membros. Para obter mais informaes, consulte Atalhos de teclado para a janela Detalhes de classe. Para criar um membro usando a classe detalhes janela Para criar um membro usando a barra de ferramentas Janela detalhes classe
3.
Visual C# Consolidado
1028
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(); } } } }
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
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; } }
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
1036
Para acessar o suporte em tempo de criao fornecido pelo .NET Framework, voc precisa concluir as etapas a seguir. Para acessar suporte Design-time 1. 2. Adicione uma referncia ao conjunto System.Design. Se voc estiver implementando ou PropertyGrid controle, importar espao para nome System.Drawing.Design. ou se o componente est interagindo com um UITypeEditor um Toolbox
C#
using System.Drawing.Design;
1. C#
Se voc estiver implementando uma experincia em tempo de design personalizada para o componente, importar espao para nome System.ComponentModel.Design.
using System.ComponentModel.Design;
1.
Se voc estiver implementando uma experincia em tempo de design personalizada para o controle Windows Forms, importar espao para nome System.Windows.Forms.Design. Voc pode criar marcas inteligentes ou um designer personalizado para o componente COM tipos no espao para esse nome.
C#
using System.Windows.Forms.Design;
Consulte tambm
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.
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()); } } }
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
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.
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); } } }
Visual C# Consolidado
1049
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.
Visual C# Consolidado
1050
2. 3. 4.
Substituir o CanConvertFrom mtodo que especifica o tipo o conversor pode converter do. Este mtodo est sobrecarregado. Substituir o ConvertFrom mtodo que implementa a converso. Este mtodo est sobrecarregado. Substituir o CanConvertTo mtodo que especifica o tipo o conversor pode converter para. No necessrio para substituir esse mtodo para converso para um tipo de seqncia. Este mtodo est sobrecarregado. Substituir o ConvertTo mtodo que implementa a converso. Este mtodo est sobrecarregado. Substituir o IsValid mtodo que realiza validao. Este mtodo est sobrecarregado.
5. 6.
O exemplo de cdigo a seguir implementa um conversor tipo que converte um String tipo em um Point tipo e a Point. em um String O CanConvertTo e IsValid mtodos no so substitudos, neste exemplo. C#
using System; using System.ComponentModel; using System.Globalization; using System.Drawing; public class PointConverter : TypeConverter { // Overrides the CanConvertFrom method of TypeConverter. // The ITypeDescriptorContext interface provides the context for the // conversion. Typically, this interface is used at design time to // provide information about the design-time container. public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) { return true; } return base.CanConvertFrom(context, sourceType); } // Overrides the ConvertFrom method of TypeConverter. public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { string[] v = ((string)value).Split(new char[] {','}); return new Point(int.Parse(v[0]), int.Parse(v[1])); } return base.ConvertFrom(context, culture, value); } // Overrides the ConvertTo method of TypeConverter. public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) { return ((Point)value).X + "," + ((Point)value).Y; } return base.ConvertTo(context, culture, value, destinationType); } }
Conversores tipo que fornecer uma lista de valores padro para uma janela Propriedades Um conversor tipo pode fornecer uma lista de valores para um tipo em um controle janela Propriedades. Quando um conversor tipo fornece um conjunto de valores padro para um tipo, o campo de entrada valor de uma propriedade do tipo associado em um controle janela Propriedades exibe uma seta para baixo que exibe uma lista de valores para definir o valor da propriedade para quando clicado. Quando uma propriedade do tipo est associado a este conversor tipo selecionada em um navegador Propriedade de ambiente em tempo de design, o campo de entrada Valor conter um boto que exibe uma lista drop-down dos valores padro para o tipo de propriedade que voc pode selecionar de. Para implementar um conversor de tipo simples que fornece uma lista drop-down de valores padro em um navegador Propriedade 1. 2. 3. Definir uma classe que deriva de TypeConverter. Substituir o GetStandardValuesSupported mtodo e retornar true. Substituir o GetStandardValues mtodo e retornar os valores padro para o tipo de propriedade com StandardValuesCollection. Os valores padro para uma propriedade deve ser do mesmo tipo que a propriedade prprio.
Visual C# Consolidado
1051
4. 5. 6.
Substituir o CanConvertFrom mtodo e retornar true para um sourceType valor de parmetro do tipo seqncia. Substituir o ConvertFrom mtodo e retornar o valor adequado para a propriedade com base no parmetro value. Aplicar uma TypeConverterAttribute que indica o tipo de seu conversor tipo para o tipo que voc est fornecendo um conjunto de valores padro para.
O exemplo a seguir demonstra um conversor tipo que fornece uma lista de valores padro para um controle janela Propriedades para uma propriedade do tipo ele est associado. O conversor tipo exemplo oferece suporte propriedades do tipo inteiro com o qual ele foi associado. Para usar o exemplo no Visual Studio .NET, compilar o cdigo para uma biblioteca de classe, e adicione o IntStandardValuesControl componente para o Toolbox. Do IntStandardValuesControl adicionar uma instncia da um formulrio no modo de design, e rolar para a TestInt propriedade na janela Propriedades enquanto o controle esteja selecionado. Selecione o campo de entrada de valor para a propriedade exibir uma seta para baixo que exibe uma lista drop-down de valores padro quando clicado. Inserir um valor inteiro ser adicione o valor para a lista de valores padro, e defina a propriedade para o valor especificado. C#
using System; using System.ComponentModel; using System.Collections; using System.Drawing; using System.Windows.Forms; namespace StandardValuesTest { public class StandardValuesIntConverter : System.ComponentModel.TypeConverter { private ArrayList values; public StandardValuesIntConverter() { // Initializes the standard values list with defaults. values = new ArrayList(new int[] { 1, 2, 3, 4, 5 }); } // Indicates this converter provides a list of standard values. public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) { return true; } // Returns a StandardValuesCollection of standard value objects. public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) { // Passes the local integer array. StandardValuesCollection svc = new StandardValuesCollection(values); return svc; } // Returns true for a sourceType of string to indicate that // conversions from string to integer are supported. (The // GetStandardValues method requires a string to native type // conversion because the items in the drop-down list are // translated to string.) public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) { if( sourceType == typeof(string) ) return true; else return base.CanConvertFrom(context, sourceType); } // If the type of the value to convert is string, parses the string // and returns the integer to set the value of the property to. // This example first extends the integer array that supplies the // standard values collection if the user-entered value is not // already in the array. public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if( value.GetType() == typeof(string) ) { // Parses the string to get the integer to set to the property. int newVal = int.Parse((string)value); // Tests whether new integer is already in the list. if( !values.Contains(newVal) ) { // If the integer is not in list, adds it in order. values.Add(newVal); values.Sort(); } // Returns the integer value to assign to the property. return newVal; } else return base.ConvertFrom(context, culture, value); } } // Provides a test control with an integer property associated with // the StandardValuesIntConverter type converter. public class IntStandardValuesControl : System.Windows.Forms.UserControl { [TypeConverter(typeof(StandardValuesIntConverter))] public int TestInt { get { return this.integer_field; } set { if(value.GetType() == typeof(int)) this.integer_field = value; } } private int integer_field = 0; public IntStandardValuesControl() { this.BackColor = Color.White; this.Size =
Visual C# Consolidado
1052
new Size(472, 80); } // OnPaint override displays instructions for the example. protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { if(this.DesignMode) { e.Graphics.DrawString("TypeConverter.GetStandardValues Example Control", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Blue), 5, 5); e.Graphics.DrawString("The type converter for the TestInt property of this", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 20); e.Graphics.DrawString("component provides a list of standard values to the", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 30); e.Graphics.DrawString("Properties window. Setting a value through a property", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 40); e.Graphics.DrawString("grid adds it to the list of standard values.", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 50); } else { e.Graphics.DrawString("TypeConverter.GetStandardValues Example Control", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Blue), 5, 5); e.Graphics.DrawString("This control was intended for use in design mode.", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 20); } } } }
Horrio conversores tipo que gerar cdigo para inicializao Propriedade em execuo O.NET Framework fornece a capacidade para gerar cdigo de inicializao dinmica propriedade em tempo de design que ser inicializar uma propriedade em tempo de execuo. Os desenvolvedores podem criar cdigo de inicializao baseado no construtor-que produz um conversor tipo. Esses conversores tipo podem gerar cdigos de construtor dinamicamente usando valores definidos em tempo de design a fim de configurar propriedades de um tipo em tempo de execuo. O conversor tipo implementa a lgica para configurar o tipo e valores de um construtor para a propriedade. Caso voc precise produzir cdigo alm um construtor para inicializar uma propriedade, possvel fazer dinamicamente gerar cdigo por implementar uma personalizada CodeDomSerializer e aplicar uma DesignerSerializerAttribute que associa para um tipo com o tipo. seu CodeDomSerializer Essa abordagem normalmente usada somente para cenrios nos quais a gerao de cdigo dinamicamente controlado ou personalizados para inicializao componente importante. Para obter mais informaes sobre essa abordagem, consulte a documentao para CodeDomSerializer. Para criar um inicializador-baseado no Construtor de propriedades personalizadas, voc deve associar um conversor tipo com o tipo da propriedade Ao inicializar, e o conversor tipo deve ser capaz para converter em uma InstanceDescriptor. Para implementar um conversor tipo que produz Propriedade baseado no construtorcdigo de inicializao 1. 2. 3. Definir uma classe que deriva de TypeConverter. Substituir o CanConvertTo mtodo. Se igual tipo, o destinationType Parmetro a InstanceDescriptor retornar true. Substituir o ConvertTo mtodo. Se o destinationType Parmetro igual o InstanceDescriptor tipo, construir e retornar um InstanceDescriptor que representa o construtor e argumentos de construtor para gerar cdigo para. Para criar um InstanceDescriptor que representa o construtor apropriado e parmetros, obter ou GetConstructors mtodo com a assinatura a mtodo apropriado do construtor voc est procurando. da propriedade voc estiver inicializando, chamando um ConstructorInfo o Type o GetConstructor Criar um novo descritor da instncia e passar para o tipo que representa o tipo de construtor a ser usado, juntamente com uma matriz de objetos de parmetro que corresponde assinatura de construtor. o ConstructorInfo
Visual C# Consolidado
1053
O exemplo a seguir implementa um conversor tipo que pode gerar cdigo de inicializao Propriedade-baseado no Construtor de propriedades do tipo Point. C#
public class PointConverter : TypeConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(InstanceDescriptor)) return true; return base.CanConvertTo(context, destinationType); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { // Insert other ConvertTo operations here. // if (destinationType == typeof(InstanceDescriptor) && value is Point) { Point pt = (Point)value; ConstructorInfo ctor = typeof(Point).GetConstructor( new Type[] {typeof(int), typeof(int)}); if (ctor != null) { return new InstanceDescriptor(ctor, new object[] {pt.X, pt.Y}); } } return base.ConvertTo(context, culture, value, destinationType); }
Compilando o cdigo
Quando voc desenvolver seu personalizadas TypeConverter, recomendvel que voc definir o nmero de criao para incrementar com cada compilao. Isso impede que verses mais antigas, armazenadas em cache de sendo criada no ambiente de desenvolvimento. seu TypeConverter
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
Inicializao personalizada do novas DemoControl instncias; Representao visual do controle Margin e Padding Propriedades; Interao mouse e teclado para definir a Anchor propriedade; Interface de marca inteligente para definir a Anchor propriedade.
C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Windows.Forms.Design.Behavior; public class Form1 : Form { private DemoControl demoControl1; private DemoControl demoControl2; private System.ComponentModel.IContainer components = null; public Form1() { InitializeComponent(); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } private void InitializeComponent() { this.demoControl2 = new DemoControl(); this.demoControl1 = new DemoControl(); this.SuspendLayout(); // // demoControl2 // this.demoControl2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.demoControl2.BackColor = System.Drawing.Color.LightBlue; this.demoControl2.Location = new System.Drawing.Point(40, 40); this.demoControl2.Margin = new System.Windows.Forms.Padding(20); this.demoControl2.Name = "demoControl2"; this.demoControl2.Padding = new System.Windows.Forms.Padding(20); this.demoControl2.Size = new System.Drawing.Size(284, 177); this.demoControl2.TabIndex = 1; // // demoControl1 // this.demoControl1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.demoControl1.BackColor = System.Drawing.Color.LightBlue; this.demoControl1.Location = new System.Drawing.Point(354, 21); this.demoControl1.Margin = new System.Windows.Forms.Padding(10); this.demoControl1.Name = "demoControl1"; this.demoControl1.Padding = new System.Windows.Forms.Padding(10); this.demoControl1.Size = new System.Drawing.Size(184, 207); this.demoControl1.TabIndex = 0; // // Form1 // this.ClientSize = new System.Drawing.Size(594, 352); this.Controls.Add(this.demoControl2); this.Controls.Add(this.demoControl1); this.Name = "Form1"; this.Padding = new System.Windows.Forms.Padding(20); this.Text = "a"; this.ResumeLayout(false); } } // This control demonstrates the use of a custom designer. [DesignerAttribute(typeof(DemoControlDesigner))]
Visual C# Consolidado
1055
public class DemoControl : UserControl { private System.ComponentModel.IContainer components = null; public DemoControl() { InitializeComponent(); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { // // DemoControl // this.Name = "DemoControl"; } } // This class demonstrates how to build a custom designer. // When an instance of the associated control type is created // in a design environment like Visual Studio, this designer // provides custom design-time behavior. // // When you drop an instance of DemoControl onto a form, // this designer creates two adorner windows: one is used // for glyphs that represent the Margin and Padding properties // of the control, and the other is used for glyphs that // represent the Anchor property. // // The AnchorGlyph type defines an AnchorBehavior type that // allows you to change the value of the Anchor property // by double-clicking on an AnchorGlyph. // // This designer also offers a smart tag for changing the // Anchor property. [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class DemoControlDesigner : ControlDesigner { // This adorner holds the glyphs that represent the Anchor property. private Adorner anchorAdorner = null; // This adorner holds the glyphs that represent the Margin and // Padding properties. private Adorner marginAndPaddingAdorner = null; // This defines the size of the anchor glyphs. private const int glyphSize = 6; // This defines the size of the hit bounds for an AnchorGlyph. private const int hitBoundSize = glyphSize + 4; // References to designer services, for convenience. private IComponentChangeService changeService = null; private ISelectionService selectionService = null; private BehaviorService behaviorSvc = null; // This is the collection of DesignerActionLists that // defines the smart tags offered on the control. private DesignerActionListCollection actionLists = null; public DemoControlDesigner() { } protected override void Dispose(bool disposing) { if (disposing) { if (this.behaviorSvc != null) { // Remove the adorners added by this designer from // the BehaviorService.Adorners collection. this.behaviorSvc.Adorners.Remove(this.marginAndPaddingAdorner); this.behaviorSvc.Adorners.Remove(this.anchorAdorner); } } base.Dispose(disposing); } // This method is where the designer initializes its state when // it is created. public override void Initialize(IComponent component) { base.Initialize(component); // Connect to various designer services. InitializeServices(); // Initialize adorners. this.InitializeMarginAndPaddingAdorner(); this.InitializeAnchorAdorner(); } // This demonstrates changing the appearance of a control while // it is being designed. In this case, the BackColor property is // set to LightBlue. public override void InitializeNewComponent(IDictionary defaultValues) { base.InitializeNewComponent(defaultValues); PropertyDescriptor colorPropDesc = TypeDescriptor.GetProperties(Component)["BackColor"]; if (colorPropDesc != null && colorPropDesc.PropertyType == typeof(Color) && !colorPropDesc.IsReadOnly && colorPropDesc.IsBrowsable) { colorPropDesc.SetValue(Component, Color.LightBlue); } } // This utility method creates an adorner for the anchor glyphs. // It then creates four AnchorGlyph objects and adds them to // the adorner's Glyphs collection. private void InitializeAnchorAdorner() { this.anchorAdorner = new Adorner(); this.behaviorSvc.Adorners.Add(this.anchorAdorner); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Left, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Top, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Right, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Bottom, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); } // This utility method creates an adorner for the margin and // padding glyphs. It then creates a MarginAndPaddingGlyph and // adds it to the adorner's Glyphs collection. private void InitializeMarginAndPaddingAdorner() { this.marginAndPaddingAdorner = new Adorner();
Visual C# Consolidado
1056
this.behaviorSvc.Adorners.Add(this.marginAndPaddingAdorner); this.marginAndPaddingAdorner.Glyphs.Add(new MarginAndPaddingGlyph( this.behaviorSvc, this.changeService, this.selectionService, this, this.marginAndPaddingAdorner)); } // This utility method connects the designer to various services. // These references are cached for convenience. private void InitializeServices() { // Acquire a reference to IComponentChangeService. this.changeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService; // Acquire a reference to ISelectionService. this.selectionService = GetService(typeof(ISelectionService)) as ISelectionService; // Acquire a reference to BehaviorService. this.behaviorSvc = GetService(typeof(BehaviorService)) as BehaviorService; } // This method creates the DesignerActionList on demand, causing // smart tags to appear on the control being designed. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new AnchorActionList(this.Component)); } return actionLists; } } // This class defines the smart tags that appear on the control // being designed. In this case, the Anchor property appears // on the smart tag and its value can be changed through a // UI Type Editor created automatically by the // DesignerActionService. public class AnchorActionList : System.ComponentModel.Design.DesignerActionList { // Cache a reference to the control. private DemoControl relatedControl; //The constructor associates the control //with the smart tag list. public AnchorActionList(IComponent component): base(component) { this.relatedControl = component as DemoControl; } // Properties that are targets of DesignerActionPropertyItem entries. public AnchorStyles Anchor { get { return this.relatedControl.Anchor; } set { PropertyDescriptor pdAnchor = TypeDescriptor.GetProperties(this.relatedControl)["Anchor"]; pdAnchor.SetValue(this.relatedControl, value); } } // This method creates and populates the // DesignerActionItemCollection which is used to // display smart tag items. public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new DesignerActionItemCollection(); // Add a descriptive header. items.Add(new DesignerActionHeaderItem("Anchor Styles")); // Add a DesignerActionPropertyItem for the Anchor // property. This will be displayed in a panel using // the AnchorStyles UI Type Editor. items.Add(new DesignerActionPropertyItem( "Anchor", "Anchor Style") ); return items; } } #region Glyph Implementations // This class implements a MarginAndPaddingGlyph, which draws // borders highlighting the value of the control's Margin // property and the value of the control's Padding property. // // This glyph has no mouse or keyboard interaction, so its // related behavior class, MarginAndPaddingBehavior, has no // implementation. public class MarginAndPaddingGlyph : Glyph { private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; private IDesigner relatedDesigner = null; private Adorner marginAndPaddingAdorner = null; private Control relatedControl = null; public MarginAndPaddingGlyph( BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner marginAndPaddingAdorner) : base(new MarginAndPaddingBehavior()) { this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.marginAndPaddingAdorner = marginAndPaddingAdorner; this.relatedControl = this.relatedDesigner.Component as Control; this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } void changeService_ComponentChanged(object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Margin" || e.Member.Name == "Padding" ) { this.marginAndPaddingAdorner.Invalidate(); } } } // This glyph has no mouse or keyboard interaction, so // GetHitTest can return null. public override Cursor GetHitTest(Point p) { return null; } // This method renders the glyph as a simple focus rectangle. public override void Paint(PaintEventArgs e) { ControlPaint.DrawFocusRectangle( e.Graphics, this.Bounds); ControlPaint.DrawFocusRectangle( e.Graphics, this.PaddingBounds); } // This glyph's Bounds property is a
Visual C# Consolidado
1057
Rectangle defined by // the value of the control's Margin property. public override Rectangle Bounds { get { Control c = this.relatedControl; Rectangle controlRect = this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left - c.Margin.Left, controlRect.Top - c.Margin.Top, controlRect.Width + c.Margin.Right*2, controlRect.Height + c.Margin.Bottom*2); return boundsVal; } } // The PaddingBounds property is a Rectangle defined by // the value of the control's Padding property. public Rectangle PaddingBounds { get { Control c = this.relatedControl; Rectangle controlRect = this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left + c.Padding.Left, controlRect.Top + c.Padding.Top, controlRect.Width c.Padding.Right * 2, controlRect.Height - c.Padding.Bottom * 2); return boundsVal; } } // There are no keyboard or mouse behaviors associated with // this glyph, but you could add them to this class. internal class MarginAndPaddingBehavior : Behavior { } } // This class implements an AnchorGlyph, which draws grab handles // that represent the value of the control's Anchor property. // // This glyph has mouse and keyboard interactions, which are // handled by the related behavior class, AnchorBehavior. // Doubleclicking on an AnchorGlyph causes its value to be // toggled between enabled and disable states. public class AnchorGlyph : Glyph { // This defines the bounds of the anchor glyph. protected Rectangle boundsValue; // This defines the bounds used for hit testing. // These bounds are typically different than the bounds // of the glyph itself. protected Rectangle hitBoundsValue; // This is the cursor returned if hit test is positive. protected Cursor hitTestCursor = Cursors.Hand; // Cache references to services that will be needed. private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; // Keep a reference to the designer for convenience. private IDesigner relatedDesigner = null; // Keep a reference to the adorner for convenience. private Adorner anchorAdorner = null; // Keep a reference to the control being designed. private Control relatedControl = null; // This defines the AnchorStyle which this glyph represents. private AnchorStyles anchorStyle; public AnchorGlyph( AnchorStyles anchorStyle, BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner anchorAdorner) : base(new AnchorBehavior(relatedDesigner)) { // Cache references for convenience. this.anchorStyle = anchorStyle; this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.anchorAdorner = anchorAdorner; // Cache a reference to the control being designed. this.relatedControl = this.relatedDesigner.Component as Control; // Hook the SelectionChanged event. this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); // Hook the ComponentChanged event so the anchor glyphs // can correctly track the control's bounds. this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } #region Overrides public override Rectangle Bounds { get { return this.boundsValue; } } // This method renders the AnchorGlyph as a filled rectangle // if the glyph is enabled, or as an open rectangle if the // glyph is disabled. public override void Paint(PaintEventArgs e) { if (this.IsEnabled) { using (Brush b = new SolidBrush(Color.Tomato)) { e.Graphics.FillRectangle(b, this.Bounds); } } else { using (Pen p = new Pen(Color.Tomato)) { e.Graphics.DrawRectangle(p, this.Bounds); } } } // An AnchorGlyph has keyboard and mouse interaction, so it's // important to return a cursor when the mouse is located in // the glyph's hit region. When this occurs, the // AnchorBehavior becomes active. public override Cursor GetHitTest(Point p) { if (hitBoundsValue.Contains(p)) { return hitTestCursor; } return null; } #endregion #region Event Handlers // The AnchorGlyph objects should mimic the resize glyphs; // they should only be visible when the control is the // primary selection. The adorner is enabled when the // control is the primary selection and disabled when // it is not. void selectionService_SelectionChanged(object sender, EventArgs e) { if
Visual C# Consolidado
1058
(object.ReferenceEquals( this.selectionService.PrimarySelection, this.relatedControl)) { this.ComputeBounds(); this.anchorAdorner.Enabled = true; } else { this.anchorAdorner.Enabled = false; } } // If any of several properties change, the bounds of the // AnchorGlyph must be computed again. void changeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Anchor" || e.Member.Name == "Size" || e.Member.Name == "Height" || e.Member.Name == "Width" || e.Member.Name == "Location") { // Compute the bounds of this glyph. this.ComputeBounds(); // Tell the adorner to repaint itself. this.anchorAdorner.Invalidate(); } } } #endregion #region Implementation // This utility method computes the position and size of // the AnchorGlyph in the Adorner window's coordinates. // It also computes the hit test bounds, which are // slightly larger than the glyph's bounds. private void ComputeBounds() { Rectangle translatedBounds = new Rectangle( this.behaviorService.ControlToAdornerWindow(this.relatedControl), this.relatedControl.Size); if ((this.anchorStyle & AnchorStyles.Top) == AnchorStyles.Top) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Y + glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Bottom) == AnchorStyles.Bottom) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Bottom - 2*glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Left) == AnchorStyles.Left) { this.boundsValue = new Rectangle( translatedBounds.X + glyphSize, translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Right) == AnchorStyles.Right) { this.boundsValue = new Rectangle( translatedBounds.Right - 2*glyphSize, translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } this.hitBoundsValue = new Rectangle( this.Bounds.Left - hitBoundSize / 2, this.Bounds.Top - hitBoundSize / 2, hitBoundSize, hitBoundSize ); } // This utility property determines if the AnchorGlyph is // enabled, according to the value specified by the // control's Anchor property. private bool IsEnabled { get { return ((this.anchorStyle & this.relatedControl.Anchor) == this.anchorStyle); } } #endregion #region Behavior Implementation // This Behavior specifies mouse and keyboard handling when // an AnchorGlyph is active. This happens when // AnchorGlyph.GetHitTest returns a non-null value. internal class AnchorBehavior : Behavior { private IDesigner relatedDesigner = null; private Control relatedControl = null; internal AnchorBehavior(IDesigner relatedDesigner) { this.relatedDesigner = relatedDesigner; this.relatedControl = relatedDesigner.Component as Control; } // When you double-click on an AnchorGlyph, the value of // the control's Anchor property is toggled. // // Note that the value of the Anchor property is not set // by direct assignment. Instead, the // PropertyDescriptor.SetValue method is used. This // enables notification of the design environment, so // related events can be raised, for example, the // IComponentChangeService.ComponentChanged event. public override bool OnMouseDoubleClick( Glyph g, MouseButtons button, Point mouseLoc) { base.OnMouseDoubleClick(g, button, mouseLoc); if (button == MouseButtons.Left) { AnchorGlyph ag = g as AnchorGlyph; PropertyDescriptor pdAnchor = TypeDescriptor.GetProperties(ag.relatedControl)["Anchor"]; if (ag.IsEnabled) { // The glyph is enabled. // Clear the AnchorStyle flag to disable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor ^ ag.anchorStyle ); } else { // The glyph is disabled. // Set the AnchorStyle flag to enable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor | ag.anchorStyle); } } return true; } } #endregion } #endregion }
A DemoControl classe derivada da UserControl classe, mas exige nenhuma lgica especial para estender sua interface do usurio em tempo de design. A interface de usurio em tempo de design implementada pela classe DemoControlDesigner.
Visual C# Consolidado
1059
Os DemoControlDesigner usos de classe a Glyph, Behavior., e Adorner classes para estender a experincia em tempo de design para DemoControl Do Glyph so implementados com os aspectos visuais da interface de usurio estendida e Adorner Classes. As interaes mouse e teclado so implementadas na classe Behavior. Voc pode estender a aparncia Design-time e o comportamento do seu designer, substituindo apenas ControlDesigner mtodos como OnPaintAdornments e OnMouseEnter. mas a Glyph classe fornece uma maneira conveniente de aparncia e comportamento lgica fora do seu designer fator Estendendo a aparncia Voc estender a aparncia do seu projeto personalizado UI, implementar uma Glyph classe. A MarginAndPaddingGlyph classe deriva da classe Glyph. Ele pinta dois retngulos que representam os valores do controle Margin e Padding Propriedades. A MarginAndPaddingGlyph classe manipula o ComponentChanged evento para atualizar a exibio quando os valores das propriedades do controle Margin ou Padding a alterao. O exemplo de cdigo a seguir mostra como implementar uma MarginAndPaddingGlyph classe que deriva de Glyph. C#
// This class implements a MarginAndPaddingGlyph, which draws // borders highlighting the value of the control's Margin // property and the value of the control's Padding property. // // This glyph has no mouse or keyboard interaction, so its // related behavior class, MarginAndPaddingBehavior, has no // implementation. public class MarginAndPaddingGlyph : Glyph { private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; private IDesigner relatedDesigner = null; private Adorner marginAndPaddingAdorner = null; private Control relatedControl = null; public MarginAndPaddingGlyph( BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner marginAndPaddingAdorner) : base(new MarginAndPaddingBehavior()) { this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.marginAndPaddingAdorner = marginAndPaddingAdorner; this.relatedControl = this.relatedDesigner.Component as Control; this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } void changeService_ComponentChanged(object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Margin" || e.Member.Name == "Padding" ) { this.marginAndPaddingAdorner.Invalidate(); } } } // This glyph has no mouse or keyboard interaction, so // GetHitTest can return null. public override Cursor GetHitTest(Point p) { return null; } // This method renders the glyph as a simple focus rectangle. public override void Paint(PaintEventArgs e) { ControlPaint.DrawFocusRectangle( e.Graphics, this.Bounds); ControlPaint.DrawFocusRectangle( e.Graphics, this.PaddingBounds); } // This glyph's Bounds property is a Rectangle defined by // the value of the control's Margin property. public override Rectangle Bounds { get { Control c = this.relatedControl; Rectangle controlRect = this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left - c.Margin.Left, controlRect.Top - c.Margin.Top, controlRect.Width + c.Margin.Right*2, controlRect.Height + c.Margin.Bottom*2); return boundsVal; } } // The PaddingBounds property is a Rectangle defined by // the value of the control's Padding property. public Rectangle PaddingBounds { get { Control c = this.relatedControl; Rectangle controlRect =
Visual C# Consolidado
1060
this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left + c.Padding.Left, controlRect.Top + c.Padding.Top, controlRect.Width c.Padding.Right * 2, controlRect.Height - c.Padding.Bottom * 2); return boundsVal; } } // There are no keyboard or mouse behaviors associated with // this glyph, but you could add them to this class. internal class MarginAndPaddingBehavior : Behavior { } }
Estender o comportamento Voc estender o comportamento do seu projeto personalizado UI, implementar uma Behavior classe. A Behavior classe subordinado Glyph Classe. Cuidado O ambiente de desenvolvimento no permite Behavior objetos que no esto conectados a um Glyph objeto. Voc anexar um Behavior objeto a um Glyph objeto no construtor seu Glyph do tipo. O exemplo de cdigo a seguir mostra como implementar o AnchorGlyph Construtor. C#
public AnchorGlyph( AnchorStyles anchorStyle, BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner anchorAdorner) : base(new AnchorBehavior(relatedDesigner)) { // Cache references for convenience. this.anchorStyle = anchorStyle; this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.anchorAdorner = anchorAdorner; // Cache a reference to the control being designed. this.relatedControl = this.relatedDesigner.Component as Control; // Hook the SelectionChanged event. this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); // Hook the ComponentChanged event so the anchor glyphs // can correctly track the control's bounds. this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); }
A AnchorGlyph classe pinta alas de seleo que correspondem ao valor da propriedade do controle Anchor. Voc substituir o GetHitTest mtodo para retornar um Cursor objeto quando o ponteiro do mouse est sobre o glifo o ponto de acesso. Quando o ambiente de desenvolvimento recebe um valor do GetHitTest mtodo que no null estiver, ele ativa o Behavior objeto associado com o Glyph. O exemplo de cdigo a seguir mostra como implementar a AnchorGlyph classe. C#
// This class implements an AnchorGlyph, which draws grab handles // that represent the value of the control's Anchor property. // // This glyph has mouse and keyboard interactions, which are // handled by the related behavior class, AnchorBehavior. // Double-clicking on an AnchorGlyph causes its value to be // toggled between enabled and disable states. public class AnchorGlyph : Glyph { // This defines the bounds of the anchor glyph. protected Rectangle boundsValue; // This defines the bounds used for hit testing. // These bounds are typically different than the bounds // of the glyph itself. protected Rectangle hitBoundsValue; //
Visual C# Consolidado
1061
This is the cursor returned if hit test is positive. protected Cursor hitTestCursor = Cursors.Hand; // Cache references to services that will be needed. private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; // Keep a reference to the designer for convenience. private IDesigner relatedDesigner = null; // Keep a reference to the adorner for convenience. private Adorner anchorAdorner = null; // Keep a reference to the control being designed. private Control relatedControl = null; // This defines the AnchorStyle which this glyph represents. private AnchorStyles anchorStyle; public AnchorGlyph( AnchorStyles anchorStyle, BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner anchorAdorner) : base(new AnchorBehavior(relatedDesigner)) { // Cache references for convenience. this.anchorStyle = anchorStyle; this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.anchorAdorner = anchorAdorner; // Cache a reference to the control being designed. this.relatedControl = this.relatedDesigner.Component as Control; // Hook the SelectionChanged event. this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); // Hook the ComponentChanged event so the anchor glyphs // can correctly track the control's bounds. this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } #region Overrides public override Rectangle Bounds { get { return this.boundsValue; } } // This method renders the AnchorGlyph as a filled rectangle // if the glyph is enabled, or as an open rectangle if the // glyph is disabled. public override void Paint(PaintEventArgs e) { if (this.IsEnabled) { using (Brush b = new SolidBrush(Color.Tomato)) { e.Graphics.FillRectangle(b, this.Bounds); } } else { using (Pen p = new Pen(Color.Tomato)) { e.Graphics.DrawRectangle(p, this.Bounds); } } } // An AnchorGlyph has keyboard and mouse interaction, so it's // important to return a cursor when the mouse is located in // the glyph's hit region. When this occurs, the // AnchorBehavior becomes active. public override Cursor GetHitTest(Point p) { if (hitBoundsValue.Contains(p)) { return hitTestCursor; } return null; } #endregion #region Event Handlers // The AnchorGlyph objects should mimic the resize glyphs; // they should only be visible when the control is the // primary selection. The adorner is enabled when the // control is the primary selection and disabled when // it is not. void selectionService_SelectionChanged(object sender, EventArgs e) { if (object.ReferenceEquals( this.selectionService.PrimarySelection, this.relatedControl)) { this.ComputeBounds(); this.anchorAdorner.Enabled = true; } else { this.anchorAdorner.Enabled = false; } } // If any of several properties change, the bounds of the // AnchorGlyph must be computed again. void changeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Anchor" || e.Member.Name == "Size" || e.Member.Name == "Height" || e.Member.Name == "Width" || e.Member.Name == "Location") { // Compute the bounds of this glyph. this.ComputeBounds(); // Tell the adorner to repaint itself. this.anchorAdorner.Invalidate(); } } } #endregion #region Implementation // This utility method computes the position and size of // the AnchorGlyph in the Adorner window's coordinates. // It also computes the hit test bounds, which are // slightly larger than the glyph's bounds. private void ComputeBounds() { Rectangle translatedBounds = new Rectangle( this.behaviorService.ControlToAdornerWindow(this.relatedControl), this.relatedControl.Size); if ((this.anchorStyle & AnchorStyles.Top) == AnchorStyles.Top) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Y + glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Bottom) == AnchorStyles.Bottom) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Bottom - 2*glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Left) == AnchorStyles.Left) { this.boundsValue = new Rectangle( translatedBounds.X + glyphSize,
Visual C# Consolidado
1062
translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Right) == AnchorStyles.Right) { this.boundsValue = new Rectangle( translatedBounds.Right - 2*glyphSize, translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } this.hitBoundsValue = new Rectangle( this.Bounds.Left - hitBoundSize / 2, this.Bounds.Top - hitBoundSize / 2, hitBoundSize, hitBoundSize ); } // This utility property determines if the AnchorGlyph is // enabled, according to the value specified by the // control's Anchor property. private bool IsEnabled { get { return ((this.anchorStyle & this.relatedControl.Anchor) == this.anchorStyle); } } #endregion
A AnchorBehavior classe implementa a interao de mouse personalizado. Voc substituir Behavior mtodos de classe como OnMouseEnter Para definir a UI personalizado. O exemplo de cdigo a seguir mostra como implementar a AnchorBehavior classe. C#
// This Behavior specifies mouse and keyboard handling when // an AnchorGlyph is active. This happens when // AnchorGlyph.GetHitTest returns a non-null value. internal class AnchorBehavior : Behavior { private IDesigner relatedDesigner = null; private Control relatedControl = null; internal AnchorBehavior(IDesigner relatedDesigner) { this.relatedDesigner = relatedDesigner; this.relatedControl = relatedDesigner.Component as Control; } // When you double-click on an AnchorGlyph, the value of // the control's Anchor property is toggled. // // Note that the value of the Anchor property is not set // by direct assignment. Instead, the // PropertyDescriptor.SetValue method is used. This // enables notification of the design environment, so // related events can be raised, for example, the // IComponentChangeService.ComponentChanged event. public override bool OnMouseDoubleClick( Glyph g, MouseButtons button, Point mouseLoc) { base.OnMouseDoubleClick(g, button, mouseLoc); if (button == MouseButtons.Left) { AnchorGlyph ag = g as AnchorGlyph; PropertyDescriptor pdAnchor = TypeDescriptor.GetProperties(ag.relatedControl)["Anchor"]; if (ag.IsEnabled) { // The glyph is enabled. // Clear the AnchorStyle flag to disable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor ^ ag.anchorStyle ); } else { // The glyph is disabled. // Set the AnchorStyle flag to enable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor | ag.anchorStyle); } } return true; } }
Ativar A interface do usurio em tempo de criao Ativar o glifos, criando uma Adorner janela e adicion-los para a Glyphs coleo. Ativar a UI Design-time personalizada adicionando a Adorner janela coleo Adorners da BehaviorService. Executar essas aes no mtodo seu designer Initialize. O exemplo de cdigo a seguir mostra como ativar a interface Design-time. C#
// This method is where the designer initializes its state when // it is created. public override void Initialize(IComponent component) { base.Initialize(component); // Connect to various designer services. InitializeServices(); // Initialize adorners. this.InitializeMarginAndPaddingAdorner(); this.InitializeAnchorAdorner(); }
C#
Visual C# Consolidado
1063
// This utility method creates an adorner for the anchor glyphs. // It then creates four AnchorGlyph objects and adds them to // the adorner's Glyphs collection. private void InitializeAnchorAdorner() { this.anchorAdorner = new Adorner(); this.behaviorSvc.Adorners.Add(this.anchorAdorner); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Left, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Top, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Right, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Bottom, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); }
C#
// This utility method creates an adorner for the margin and // padding glyphs. It then creates a MarginAndPaddingGlyph and // adds it to the adorner's Glyphs collection. private void InitializeMarginAndPaddingAdorner() { this.marginAndPaddingAdorner = new Adorner(); this.behaviorSvc.Adorners.Add(this.marginAndPaddingAdorner); this.marginAndPaddingAdorner.Glyphs.Add(new MarginAndPaddingGlyph( this.behaviorSvc, this.changeService, this.selectionService, this, this.marginAndPaddingAdorner)); }
Compilando o cdigo Quando voc faz alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.
COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao
O exemplo a seguir ilustra como criar um controle personalizado e um designer personalizado associado. Quando essa biblioteca criada, voc pode criar implementaes personalizadas MarqueeControl que executados em um formulrio. H suporte para esta tarefa no Visual Studio abrangente. Exemplo C#
using System; namespace MarqueeControlLibrary { // This interface defines the contract for any class that is to // be used in constructing a MarqueeControl. public interface IMarqueeWidget { // This method starts the animation. If the control can // contain other classes that implement IMarqueeWidget as // children, the control should call StartMarquee on all // its IMarqueeWidget child controls. void StartMarquee(); // This method stops the animation. If the control can // contain other classes that implement IMarqueeWidget as // children, the control should call StopMarquee on all // its IMarqueeWidget child controls. void StopMarquee(); // This method specifies the refresh rate for the animation, // in milliseconds. int UpdatePeriod { get; set; } } }
C#
Visual C# Consolidado
1064
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing; using System.Drawing.Design; using System.Threading; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { // This defines the possible values for the MarqueeBorder // control's SpinDirection property. public enum MarqueeSpinDirection { CW, CCW } // This defines the possible values for the MarqueeBorder // control's LightShape property. public enum MarqueeLightShape { Square, Circle } [Designer(typeof(MarqueeControlLibrary.Design.MarqueeBorderDesigner ))] [ToolboxItemFilter("MarqueeControlLibrary.MarqueeBorder", ToolboxItemFilterType.Require)] public class MarqueeBorder : Panel, IMarqueeWidget { public static int MaxLightSize = 10; // These fields back the public properties. private int updatePeriodValue = 50; private int lightSizeValue = 5; private int lightPeriodValue = 3; private int lightSpacingValue = 1; private Color lightColorValue; private Color darkColorValue; private MarqueeSpinDirection spinDirectionValue = MarqueeSpinDirection.CW; private MarqueeLightShape lightShapeValue = MarqueeLightShape.Square; // These brushes are used to paint the light and dark // colors of the marquee lights. private Brush lightBrush; private Brush darkBrush; // This field tracks the progress of the "first" light as it // "travels" around the marquee border. private int currentOffset = 0; // This component updates the control asynchronously. private System.ComponentModel.BackgroundWorker backgroundWorker1; public MarqueeBorder() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // Initialize light and dark colors // to the control's default values. this.lightColorValue = this.ForeColor; this.darkColorValue = this.BackColor; this.lightBrush = new SolidBrush(this.lightColorValue); this.darkBrush = new SolidBrush(this.darkColorValue); // The MarqueeBorder control manages its own padding, // because it requires that any contained controls do // not overlap any of the marquee lights. int pad = 2 * (this.lightSizeValue + this.lightSpacingValue); this.Padding = new Padding(pad, pad, pad, pad); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } /////////////////////////////////////////////////////////////////////// #region IMarqueeWidget implementation public virtual void StartMarquee() { // The MarqueeBorder control may contain any number of // controls that implement IMarqueeWidget, so find // each IMarqueeWidget child and call its StartMarquee // method. foreach (Control cntrl in this.Controls) { if (cntrl is IMarqueeWidget) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StartMarquee(); } } // Start the updating thread and pass it the UpdatePeriod. this.backgroundWorker1.RunWorkerAsync(this.UpdatePeriod); } public virtual void StopMarquee() { // The MarqueeBorder control may contain any number of // controls that implement IMarqueeWidget, so find // each IMarqueeWidget child and call its StopMarquee // method. foreach (Control cntrl in this.Controls) { if (cntrl is IMarqueeWidget) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StopMarquee(); } } // Stop the updating thread. this.backgroundWorker1.CancelAsync(); } [Category("Marquee")] [Browsable(true)] public virtual int UpdatePeriod { get { return this.updatePeriodValue; } set { if (value > 0) { this.updatePeriodValue = value; } else { throw new ArgumentOutOfRangeException("UpdatePeriod", "must be > 0"); } } } #endregion /////////////////////////////////////////////////////////////////////// #region Public Properties [Category("Marquee")] [Browsable(true)] public int LightSize { get { return this.lightSizeValue; } set { if (value > 0 && value <= MaxLightSize) { this.lightSizeValue = value; this.DockPadding.All = 2 * value; } else { throw new ArgumentOutOfRangeException("LightSize", "must be > 0 and < MaxLightSize"); } } } [Category("Marquee")] [Browsable(true)] public int LightPeriod { get { return this.lightPeriodValue; } set { if (value > 0) { this.lightPeriodValue = value; } else { throw new ArgumentOutOfRangeException("LightPeriod", "must be > 0 "); } } } [Category("Marquee")] [Browsable(true)] public Color LightColor { get { return this.lightColorValue; } set { // The LightColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb
Visual C# Consolidado
1065
method is the recommended test for // equality between Color structs. if (this.lightColorValue.ToArgb() != value.ToArgb()) { this.lightColorValue = value; this.lightBrush = new SolidBrush(value); } } } [Category("Marquee")] [Browsable(true)] public Color DarkColor { get { return this.darkColorValue; } set { // The DarkColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb method is the recommended test for // equality between Color structs. if (this.darkColorValue.ToArgb() != value.ToArgb()) { this.darkColorValue = value; this.darkBrush = new SolidBrush(value); } } } [Category("Marquee")] [Browsable(true)] public int LightSpacing { get { return this.lightSpacingValue; } set { if (value >= 0) { this.lightSpacingValue = value; } else { throw new ArgumentOutOfRangeException("LightSpacing", "must be >= 0"); } } } [Category("Marquee")] [Browsable(true)] [EditorAttribute(typeof(LightShapeEditor), typeof(System.Drawing.Design.UITypeEditor))] public MarqueeLightShape LightShape { get { return this.lightShapeValue; } set { this.lightShapeValue = value; } } [Category("Marquee")] [Browsable(true)] public MarqueeSpinDirection SpinDirection { get { return this.spinDirectionValue; } set { this.spinDirectionValue = value; } } #endregion /////////////////////////////////////////////////////////////////////// #region Implementation protected override void OnLayout(LayoutEventArgs levent) { base.OnLayout(levent); // Repaint when the layout has changed. this.Refresh(); } // This method paints the lights around the border of the // control. It paints the top row first, followed by the // right side, the bottom row, and the left side. The color // of each light is determined by the IsLit method and // depends on the light's position relative to the value // of currentOffset. protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; g.Clear(this.BackColor); base.OnPaint(e); // If the control is large enough, draw some lights. if (this.Width > MaxLightSize && this.Height > MaxLightSize) { // The position of the next light will be incremented // by this value, which is equal to the sum of the // light size and the space between two lights. int increment = this.lightSizeValue + this.lightSpacingValue; // Compute the number of lights to be drawn along the // horizontal edges of the control. int horizontalLights = (this.Width - increment) / increment; // Compute the number of lights to be drawn along the // vertical edges of the control. int verticalLights = (this.Height increment) / increment; // These local variables will be used to position and // paint each light. int xPos = 0; int yPos = 0; int lightCounter = 0; Brush brush; // Draw the top row of lights. for (int i = 0; i < horizontalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); xPos += increment; lightCounter++; } // Draw the lights flush with the right edge of the control. xPos = this.Width - this.lightSizeValue; // Draw the right column of lights. for (int i = 0; i < verticalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); yPos += increment; lightCounter++; } // Draw the lights flush with the bottom edge of the control. yPos = this.Height - this.lightSizeValue; // Draw the bottom row of lights. for (int i = 0; i < horizontalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); xPos -= increment; lightCounter++; } // Draw the lights flush with the left edge of the control. xPos = 0; // Draw the left column of lights. for (int i = 0; i < verticalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); yPos -= increment; lightCounter++; } } } // This method determines if the marquee light at lightIndex // should be lit. The currentOffset field specifies where // the "first" light is located, and the "position" of the // light given by lightIndex is computed relative to this // offset. If this position modulo lightPeriodValue is zero, // the light is considered to be on, and it will be painted // with the control's lightBrush. protected virtual bool IsLit(int lightIndex) { int directionFactor = (this.spinDirectionValue == MarqueeSpinDirection.CW ? -1 : 1); return ( (lightIndex + directionFactor * this.currentOffset) % this.lightPeriodValue == 0 ); } protected virtual void DrawLight( Graphics g, Brush brush, int xPos, int yPos) { switch (this.lightShapeValue) { case MarqueeLightShape.Square: { g.FillRectangle(brush, xPos, yPos, this.lightSizeValue, this.lightSizeValue); break; } case
Visual C# Consolidado
1066
MarqueeLightShape.Circle: { g.FillEllipse(brush, xPos, yPos, this.lightSizeValue, this.lightSizeValue); break; } default: { Trace.Assert(false, "Unknown value for light shape."); break; } } } // This method is called in the worker thread's context, // so it must not make any calls into the MarqueeBorder // control. Instead, it communicates to the control using // the ProgressChanged event. // // The only work done in this event handler is // to sleep for the number of milliseconds specified // by UpdatePeriod, then raise the ProgressChanged event. private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; // This event handler will run until the client cancels // the background task by calling CancelAsync. while (!worker.CancellationPending) { // The Argument property of the DoWorkEventArgs // object holds the value of UpdatePeriod, which // was passed as the argument to the RunWorkerAsync // method. Thread.Sleep((int)e.Argument); // The DoWork eventhandler does not actually report // progress; the ReportProgress event is used to // periodically alert the control to update its state. worker.ReportProgress(0); } } // The ProgressChanged event is raised by the DoWork method. // This event handler does work that is internal to the // control. In this case, the currentOffset is incremented, // and the control is told to repaint itself. private void backgroundWorker1_ProgressChanged( object sender, System.ComponentModel.ProgressChangedEventArgs e) { this.currentOffset++; this.Refresh(); } // This class demonstrates the use of a custom UITypeEditor. // It allows the MarqueeBorder control's LightShape property // to be changed at design time using a customized UI element // that is invoked by the Properties window. The UI is provided // by the LightShapeSelectionControl class. internal class LightShapeEditor : UITypeEditor { private IWindowsFormsEditorService editorService = null; public override UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown; } public override object EditValue( ITypeDescriptorContext context, IServiceProvider provider, object value) { if (provider != null) { editorService = provider.GetService( typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; } if (editorService != null) { LightShapeSelectionControl selectionControl = new LightShapeSelectionControl( (MarqueeLightShape)value, editorService); editorService.DropDownControl(selectionControl); value = selectionControl.LightShape; } return value; } // This method indicates to the design environment that // the type editor will paint additional content in the // LightShape entry in the PropertyGrid. public override bool GetPaintValueSupported( ITypeDescriptorContext context) { return true; } // This method paints a graphical representation of the // selected value of the LightShpae property. public override void PaintValue(PaintValueEventArgs e) { MarqueeLightShape shape = (MarqueeLightShape)e.Value; using (Pen p = Pens.Black) { if (shape == MarqueeLightShape.Square) { e.Graphics.DrawRectangle(p, e.Bounds); } else { e.Graphics.DrawEllipse(p, e.Bounds); } } } } private void InitializeComponent() { this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); // // backgroundWorker1 // this.backgroundWorker1.WorkerReportsProgress = true; this.backgroundWorker1.WorkerSupportsCancellation = true; this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged); this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); } #endregion } }
C#
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing; using System.Threading; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { [ToolboxItemFilter("MarqueeControlLibrary.MarqueeText", ToolboxItemFilterType.Require)] public class MarqueeText : Label, IMarqueeWidget { // When isLit is true, the text is painted in the light color; // When
Visual C# Consolidado
1067
isLit is false, the text is painted in the dark color. // This value changes whenever the BackgroundWorker component // raises the ProgressChanged event. private bool isLit = true; // These fields back the public properties. private int updatePeriodValue = 50; private Color lightColorValue; private Color darkColorValue; // These brushes are used to paint the light and dark // colors of the text. private Brush lightBrush; private Brush darkBrush; // This component updates the control asynchronously. private BackgroundWorker backgroundWorker1; public MarqueeText() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // Initialize light and dark colors // to the control's default values. this.lightColorValue = this.ForeColor; this.darkColorValue = this.BackColor; this.lightBrush = new SolidBrush(this.lightColorValue); this.darkBrush = new SolidBrush(this.darkColorValue); } /////////////////////////////////////////////////////////////////////// #region IMarqueeWidget implementation public virtual void StartMarquee() { // Start the updating thread and pass it the UpdatePeriod. this.backgroundWorker1.RunWorkerAsync(this.UpdatePeriod); } public virtual void StopMarquee() { // Stop the updating thread. this.backgroundWorker1.CancelAsync(); } [Category("Marquee")] [Browsable(true)] public int UpdatePeriod { get { return this.updatePeriodValue; } set { if (value > 0) { this.updatePeriodValue = value; } else { throw new ArgumentOutOfRangeException("UpdatePeriod", "must be > 0"); } } } #endregion /////////////////////////////////////////////////////////////////////// #region Public Properties [Category("Marquee")] [Browsable(true)] public Color LightColor { get { return this.lightColorValue; } set { // The LightColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb method is the recommended test for // equality between Color structs. if (this.lightColorValue.ToArgb() != value.ToArgb()) { this.lightColorValue = value; this.lightBrush = new SolidBrush(value); } } } [Category("Marquee")] [Browsable(true)] public Color DarkColor { get { return this.darkColorValue; } set { // The DarkColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb method is the recommended test for // equality between Color structs. if (this.darkColorValue.ToArgb() != value.ToArgb()) { this.darkColorValue = value; this.darkBrush = new SolidBrush(value); } } } #endregion /////////////////////////////////////////////////////////////////////// #region Implementation protected override void OnPaint(PaintEventArgs e) { // The text is painted in the light or dark color, // depending on the current value of isLit. this.ForeColor = this.isLit ? this.lightColorValue : this.darkColorValue; base.OnPaint(e); } // This method is called in the worker thread's context, // so it must not make any calls into the MarqueeText control. // Instead, it communicates to the control using the // ProgressChanged event. // // The only work done in this event handler is // to sleep for the number of milliseconds specified // by UpdatePeriod, then raise the ProgressChanged event. private void backgroundWorker1_DoWork( object sender, System.ComponentModel.DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; // This event handler will run until the client cancels // the background task by calling CancelAsync. while (!worker.CancellationPending) { // The Argument property of the DoWorkEventArgs // object holds the value of UpdatePeriod, which // was passed as the argument to the RunWorkerAsync // method. Thread.Sleep((int)e.Argument); // The DoWork eventhandler does not actually report // progress; the ReportProgress event is used to // periodically alert the control to update its state. worker.ReportProgress(0); } } // The ProgressChanged event is raised by the DoWork method. // This event handler does work that is internal to the // control. In this case, the text is toggled between its // light and dark state, and the control is told to // repaint itself. private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { this.isLit = !this.isLit; this.Refresh(); } private void InitializeComponent() { this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); // // backgroundWorker1 //
Visual C# Consolidado
1068
this.backgroundWorker1.WorkerReportsProgress = true; this.backgroundWorker1.WorkerSupportsCancellation = true; this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged); this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); } #endregion } }
C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { [Designer( typeof( MarqueeControlLibrary.Design.MarqueeControlRootDesigner ), typeof( IRootDesigner ) )] public class MarqueeControl : UserControl { // Required designer variable. private System.ComponentModel.Container components = null; public MarqueeControl() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // Minimize flickering during animation by enabling // double buffering. SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } public void Start() { // The MarqueeControl may contain any number of // controls that implement IMarqueeWidget, so // find each IMarqueeWidget child and call its // StartMarquee method. foreach( Control cntrl in this.Controls ) { if( cntrl is IMarqueeWidget ) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StartMarquee(); } } } public void Stop() { // The MarqueeControl may contain any number of // controls that implement IMarqueeWidget, so find // each IMarqueeWidget child and call its StopMarquee // method. foreach( Control cntrl in this.Controls ) { if( cntrl is IMarqueeWidget ) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StopMarquee(); } } } protected override void OnLayout(LayoutEventArgs levent) { base.OnLayout (levent); // Repaint all IMarqueeWidget children if the layout // has changed. foreach( Control cntrl in this.Controls ) { if( cntrl is IMarqueeWidget ) { Control control = cntrl as Control; control.PerformLayout(); } } } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { components = new System.ComponentModel.Container(); } #endregion } }
C#
using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { // This control provides the custom UI for the LightShape property // of the MarqueeBorder. It is used by the LightShapeEditor. public class LightShapeSelectionControl : System.Windows.Forms.UserControl { private MarqueeLightShape lightShapeValue = MarqueeLightShape.Square; private IWindowsFormsEditorService editorService = null; private System.Windows.Forms.Panel squarePanel; private System.Windows.Forms.Panel circlePanel; // Required designer variable. private System.ComponentModel.Container components = null; // This constructor takes a MarqueeLightShape value from the // design-time environment, which will be used to display // the initial state. public LightShapeSelectionControl( MarqueeLightShape lightShape, IWindowsFormsEditorService editorService ) { // This call is required by the designer. InitializeComponent(); // Cache the light shape value provided by the // design-time environment. this.lightShapeValue = lightShape; // Cache the reference to the editor service. this.editorService = editorService; // Handle the Click event for the two panels. this.squarePanel.Click += new EventHandler(squarePanel_Click); this.circlePanel.Click += new
Visual C# Consolidado
1069
EventHandler(circlePanel_Click); } protected override void Dispose( bool disposing ) { if( disposing ) { // Be sure to unhook event handlers // to prevent "lapsed listener" leaks. this.squarePanel.Click -= new EventHandler(squarePanel_Click); this.circlePanel.Click -= new EventHandler(circlePanel_Click); if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } // LightShape is the property for which this control provides // a custom user interface in the Properties window. public MarqueeLightShape LightShape { get { return this.lightShapeValue; } set { if( this.lightShapeValue != value ) { this.lightShapeValue = value; } } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint (e); using( Graphics gSquare = this.squarePanel.CreateGraphics(), gCircle = this.circlePanel.CreateGraphics() ) { // Draw a filled square in the client area of // the squarePanel control. gSquare.FillRectangle( Brushes.Red, 0, 0, this.squarePanel.Width, this.squarePanel.Height ); // If the Square option has been selected, draw a // border inside the squarePanel. if( this.lightShapeValue == MarqueeLightShape.Square ) { gSquare.DrawRectangle( Pens.Black, 0, 0, this.squarePanel.Width-1, this.squarePanel.Height-1); } // Draw a filled circle in the client area of // the circlePanel control. gCircle.Clear( this.circlePanel.BackColor ); gCircle.FillEllipse( Brushes.Blue, 0, 0, this.circlePanel.Width, this.circlePanel.Height ); // If the Circle option has been selected, draw a // border inside the circlePanel. if( this.lightShapeValue == MarqueeLightShape.Circle ) { gCircle.DrawRectangle( Pens.Black, 0, 0, this.circlePanel.Width-1, this.circlePanel.Height-1); } } } private void squarePanel_Click(object sender, EventArgs e) { this.lightShapeValue = MarqueeLightShape.Square; this.Invalidate( false ); this.editorService.CloseDropDown(); } private void circlePanel_Click(object sender, EventArgs e) { this.lightShapeValue = MarqueeLightShape.Circle; this.Invalidate( false ); this.editorService.CloseDropDown(); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.squarePanel = new System.Windows.Forms.Panel(); this.circlePanel = new System.Windows.Forms.Panel(); this.SuspendLayout(); // // squarePanel // this.squarePanel.Location = new System.Drawing.Point(8, 10); this.squarePanel.Name = "squarePanel"; this.squarePanel.Size = new System.Drawing.Size(60, 60); this.squarePanel.TabIndex = 2; // // circlePanel // this.circlePanel.Location = new System.Drawing.Point(80, 10); this.circlePanel.Name = "circlePanel"; this.circlePanel.Size = new System.Drawing.Size(60, 60); this.circlePanel.TabIndex = 3; // // LightShapeSelectionControl // this.Controls.Add(this.squarePanel); this.Controls.Add(this.circlePanel); this.Name = "LightShapeSelectionControl"; this.Size = new System.Drawing.Size(150, 80); this.ResumeLayout(false); } #endregion } }
C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary.Design { [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class MarqueeBorderDesigner : ParentControlDesigner { public MarqueeBorderDesigner() { Trace.WriteLine("MarqueeBorderDesigner"); } public bool Visible { get { return (bool)ShadowProperties["Visible"]; } set { this.ShadowProperties["Visible"] = value; } } public bool Enabled { get { return (bool)ShadowProperties["Enabled"]; } set { this.ShadowProperties["Enabled"] = value; } } protected override void PreFilterProperties(IDictionary properties) { base.PreFilterProperties(properties); if (properties.Contains("Padding")) { properties.Remove("Padding"); } properties["Visible"] = TypeDescriptor.CreateProperty( typeof(MarqueeBorderDesigner), (PropertyDescriptor)properties["Visible"], new Attribute[0]); properties["Enabled"] = TypeDescriptor.CreateProperty(
Visual C# Consolidado
1070
typeof(MarqueeBorderDesigner), (PropertyDescriptor)properties["Enabled"], new Attribute[0]); } private void OnVerbRunTest(object sender, EventArgs e) { IMarqueeWidget widget = this.Control as IMarqueeWidget; widget.StartMarquee(); } private void OnVerbStopTest(object sender, EventArgs e) { IMarqueeWidget widget = this.Control as IMarqueeWidget; widget.StopMarquee(); } } }
C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary.Design { [ToolboxItemFilter("MarqueeControlLibrary.MarqueeBorder", ToolboxItemFilterType.Require)] [ToolboxItemFilter("MarqueeControlLibrary.MarqueeText", ToolboxItemFilterType.Require)] [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class MarqueeControlRootDesigner : DocumentDesigner { public MarqueeControlRootDesigner() { Trace.WriteLine("MarqueeControlRootDesigner ctor"); } public override void Initialize(IComponent component) { base.Initialize(component); IComponentChangeService cs = GetService(typeof(IComponentChangeService)) as IComponentChangeService; if (cs != null) { cs.ComponentChanged += new ComponentChangedEventHandler(OnComponentChanged); } this.Verbs.Add( new DesignerVerb("Run Test", new EventHandler(OnVerbRunTest)) ); this.Verbs.Add( new DesignerVerb("Stop Test", new EventHandler(OnVerbStopTest)) ); } private void OnComponentChanged( object sender, ComponentChangedEventArgs e) { if (e.Component is IMarqueeWidget) { this.Control.Refresh(); } } private void OnVerbRunTest(object sender, EventArgs e) { MarqueeControl c = this.Control as MarqueeControl; c.Start(); } private void OnVerbStopTest(object sender, EventArgs e) { MarqueeControl c = this.Control as MarqueeControl; c.Stop(); } } }
Compilando o cdigo
Visual C# Consolidado
1071
System.Drawing.Point(41, 42); this.colorLabel2.Name = "colorLabel2"; this.colorLabel2.Size = new System.Drawing.Size(117, 25); this.colorLabel2.TabIndex = 0; this.colorLabel2.Text = "colorLabel2"; // // Form1 // this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.colorLabel2); this.Name = "Form1"; this.ResumeLayout(false); } [STAThread] static void Main() { Form1 f1 = new Form1(); f1.ShowDialog(); } } ///////////////////////////////////////////////////////////////// // ColorLabel is a simple extension of the standard Label control, // with color property locking added. ///////////////////////////////////////////////////////////////// [Designer(typeof(ColorLabelDesigner))] public class ColorLabel : System.Windows.Forms.Label { private bool colorLockedValue = false; public bool ColorLocked { get { return colorLockedValue; } set { colorLockedValue = value; } } public override Color BackColor { get { return base.BackColor; } set { if (ColorLocked) return; else base.BackColor = value; } } public override Color ForeColor { get { return base.ForeColor; } set { if (ColorLocked) return; else base.ForeColor = value; } } } ///////////////////////////////////////////////////////////////// // Designer for the ColorLabel control with support for a smart // tag panel. // Must add reference to System.Design.dll ///////////////////////////////////////////////////////////////// [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class ColorLabelDesigner : System.Windows.Forms.Design.ControlDesigner { private DesignerActionListCollection actionLists; // Use pull model to populate smart tag menu. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new ColorLabelActionList(this.Component)); } return actionLists; } } } ///////////////////////////////////////////////////////////////// // DesignerActionListderived class defines smart tag entries and // resultant actions. ///////////////////////////////////////////////////////////////// public class ColorLabelActionList : System.ComponentModel.Design.DesignerActionList { private ColorLabel colLabel; private DesignerActionUIService designerActionUISvc = null; //The constructor associates the control //with the smart tag list. public ColorLabelActionList( IComponent component ) : base(component) { this.colLabel = component as ColorLabel; // Cache a reference to DesignerActionUIService, so the // DesigneractionList can be refreshed. this.designerActionUISvc = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; } // Helper method to retrieve control properties. Use of // GetProperties enables undo and menu updates to work properly. private PropertyDescriptor GetPropertyByName(String propName) { PropertyDescriptor prop; prop = TypeDescriptor.GetProperties(colLabel)[propName]; if (null == prop) throw new ArgumentException( "Matching ColorLabel property not found!", propName); else return prop; } // Properties that are targets of DesignerActionPropertyItem entries. public Color BackColor { get { return colLabel.BackColor; } set { GetPropertyByName("BackColor").SetValue(colLabel, value); } } public Color ForeColor { get { return colLabel.ForeColor; } set { GetPropertyByName("ForeColor").SetValue(colLabel, value); } } // Boolean properties are automatically displayed with binary // UI (such as a checkbox). public bool LockColors { get { return colLabel.ColorLocked; } set { GetPropertyByName("ColorLocked").SetValue(colLabel, value); // Refresh the list. this.designerActionUISvc.Refresh(this.Component); } } public String Text { get { return colLabel.Text; } set { GetPropertyByName("Text").SetValue(colLabel, value); } } // Method that is target of a DesignerActionMethodItem public void InvertColors() { Color currentBackColor = colLabel.BackColor; BackColor = Color.FromArgb( 255 - currentBackColor.R, 255 - currentBackColor.G, 255 currentBackColor.B); Color currentForeColor = colLabel.ForeColor; ForeColor = Color.FromArgb( 255 currentForeColor.R, 255 - currentForeColor.G, 255 - currentForeColor.B); } // Implementation of this abstract method creates smart tag // items, associates their targets, and collects into list. public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new
Visual C# Consolidado
1072
DesignerActionItemCollection(); //Define static section header entries. items.Add(new DesignerActionHeaderItem("Appearance")); items.Add(new DesignerActionHeaderItem("Information")); //Boolean property for locking color selections. items.Add(new DesignerActionPropertyItem("LockColors", "Lock Colors", "Appearance", "Locks the color properties.")); if (!LockColors) { items.Add(new DesignerActionPropertyItem("BackColor", "Back Color", "Appearance", "Selects the background color.")); items.Add(new DesignerActionPropertyItem("ForeColor", "Fore Color", "Appearance", "Selects the foreground color.")); //This next method item is also added to the context menu // (as a designer verb). items.Add(new DesignerActionMethodItem(this, "InvertColors", "Invert Colors", "Appearance", "Inverts the fore and background colors.", true)); } items.Add(new DesignerActionPropertyItem("Text", "Text String", "Appearance", "Sets the display text.")); //Create entries for static Information section. StringBuilder location = new StringBuilder("Location: "); location.Append(colLabel.Location); StringBuilder size = new StringBuilder("Size: "); size.Append(colLabel.Size); items.Add(new DesignerActionTextItem(location.ToString(), "Information")); items.Add(new DesignerActionTextItem(size.ToString(), "Information")); return items; } } }
Compilar o cdigo Sempre que fizer alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, ento voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.
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:
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
Visual C# Consolidado
1080
Microsoft Visual Studio 2005 Tools for the Microsoft Office System Excel Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Criando um novo projeto Nesta etapa, voc ir criar um projeto de aplicativos do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome WinFormInput. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o WinFormInput projeto para Solution Explorer. Adicionar um controle NamedRange para a planilha
Para adicionar um intervalo nomeado para Sheet1 4. 5. Selecione a clula A1 no Sheet1. Na caixa Name, digite formInput. A Name caixa est localizada esquerda da barra de frmulas, logo acima coluna A da planilha. 6. Pressione ENTER.
Visual C# Consolidado
1081
Um NamedRange controle adicionado clula A1. No h nenhuma indicao visvel na planilha, mas formInput aparece na caixa Name (logo acima a planilha no lado esquerdo). e na Properties janela quando a clula A1 selecionada Adicionar um formulrio do Windows ao projeto Criar um formulrio do Windows para o usurio fornea informaes prompt. Para adicionar um formulrio do Windows 6. 7. 8. Selecione o projeto WinFormInput no Solution Explorer. No menu Project, clique em Add Windows Form. Nome do formulrio GetInputString.vb ou GetInputString.cs. e, em seguida clique em Add O novo formulrio aberto no designer. 9. Adicionar um TextBox e um Button. para o formulrio 10. Selecione o boto, localizar a propriedade Text na janela Properties, e alterar o texto OK. Em seguida, adicione cdigo para ThisWorkbook.vb ou ThisWorkbook.cs para coletar informaes do usurio. Exibindo o formulrio do Windows e coletando informaes Criar uma instncia do formulrio GetInputString Windows e exibi-lo, e em seguida, escrever as informaes do usurio em uma clula na planilha. Para exibir o formulrio e coletar informaes 4. 5. Clique com o boto direito do mouse ThisWorkbook.vb ou ThisWorkbook.cs em Solution Explorer e selecione View Code. No manipulador Open de eventos de ThisWorkbook, adicione o seguinte cdigo para declarar uma varivel para o formulrio GetInputString e depois exibir o formulrio: Observao Em C#, voc deve adicionar um manipulador de eventos como mostrado no Startup evento abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. 6. C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { this.Open += new Microsoft.Office.Interop.Excel.WorkbookEvents_OpenEventHandler(ThisWorkbook_Open); } private void ThisWorkbook_Open() { GetInputString inputForm = new GetInputString(); inputForm.Show(); }
7.
Criar um mtodo chamado WriteStringToCell que grave texto em um intervalo nomeado. Esse mtodo chamado do formulrio, e entrado sero passadas para o NamedRange controle, formInput o usurio,. na clula A1 C#
public void WriteStringToCell(string formData) { Globals.Sheet1.formInput.Value2 = formData; }
Prxima adicionar cdigo ao formulrio para lidar com clique o boto na evento.
Visual C# Consolidado
1082
Enviar informaes para a planilha Para enviar informaes para a planilha 4. 5. 6. Clique com o boto direito do mouse GetInputString em Solution Explorer, e selecione View Designer. Clique duas vezes no boto para abrir o arquivo de cdigo com manipulador de eventos do boto Click adicionado. Adicione cdigo ao manipulador de eventos para levar a entrada da caixa de texto, envi-lo para a funo WriteStringToCell, e depois feche o formulrio. C#
Globals.ThisWorkbook.WriteStringToCell(this.textBox1.Text); this.Dispose();
Testando Agora voc pode testar sua pasta de trabalho para certificar-se de que o formulrio Windows aparecer, e se a entrada aparece nesta planilha. Para testar sua pasta de trabalho 5. 6. 7. 8. Pressione F5 para executar o projeto. Confirme se o formulrio Windows aparece. Digite Hello World na caixa de texto e clique em OK. Confirme que Hello World aparece na clula A1 da planilha. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do mostrando um Windows Form e dados passagem para uma planilha. Outras tarefas pode desejar executar incluem:
Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard.
Adicione texto e controles para uma planilha. Formate o texto quando uma opo selecionada. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte
Visual C# Consolidado
1083
Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto
Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome My Excel Formatting. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Formatting projeto para Solution Explorer. Adicionar texto e controles a planilha
Para essa explicao passo a passo, voc precisar trs CheckBox controles e algum texto em um NamedRange controle. Para adicionar trs caixas de seleo 9. Verifique se a pasta de trabalho est abra no designer visual studio e que Sheet1 est aberto.
10. Na guia Common Controls da Toolbox, arraste um CheckBox controle para ou prxima clula B2 na Sheet1. 11. No menu View, selecione Properties Janela. 12. Certifique-se de que que Checkbox1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Propriedade Name Text Value (Valor) applyBoldFont Negrito
13. Arraste uma segunda caixa de seleo ou prxima clula B4 e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) applyItalicFont Itlico
14. Arraste uma caixa de seleo terceira ou prxima clula B6 e alterar as seguintes propriedades: Propriedade Name Value (Valor) applyUnderlineFont
Visual C# Consolidado
1084
Text
Sublinhado
15. Selecione todos os controles caixa de seleo trs mantendo a tecla CTRL. 16. Na barra de ferramentas do Excel, clique em Align Lefts e, em seguida clique em Make Vertical Spacing Equal. Os controles caixa de seleo trs agora tem igual espaamento vertical e so alinhados no lado esquerdo, na posio do primeiro controle que voc selecionou. Voc em seguida, ser arrastar um NamedRange controle para a planilha. Observao Voc tambm pode adicionar o NamedRange controle digitando textFont na caixa Name. Para adicionar texto a um controle NamedRange 6. 7. 8. 9. Na guia Excel Controls da caixa de ferramentas, arraste um NamedRange controle clula B9. Verificar que $B$9 aparece na caixa de texto editvel, e essa clula B9 estiver selecionada. Se no estiver, clique em Clula B9 para selecion-lo. Clique em OK. Clula B9 se torna um intervalo nomeado NamedRange1. No h nenhuma indicao visvel na planilha, mas NamedRange1 aparece no. (logo acima a planilha no lado esquerdo) quando Clula B9 estiver selecionada a Name box 10. Certifique-se de que que NamedRange1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Propriedade Name Value2 Value (Valor) textFont Clique em uma caixa de seleo para alterar a formatao de texto.
Em seguida, escreva o cdigo para formatar o texto quando uma opo selecionada. Formatao quando a opo um texto selecionado Voc nesta seo, vai escrever cdigo para que quando o usurio seleciona uma opo de formatao, o formato do texto na planilha for alterado.
8.
Visual C# Consolidado
1085
9.
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.
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:
Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel.
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.
10. Arraste um Button controle at Sheet1 e alterar as seguintes propriedades: Propriedade Name Value (Valor) insertText
Visual C# Consolidado
1087
Text
Inserir texto
Agora Escreva o cdigo a ser executado quando o boto clicado. Preencher a caixa de texto quando o boto Clicked Sempre que o usurio clica no boto, Hello World! acrescentada caixa de texto.
6.
Em C#, adicione um manipulador de eventos para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.insertText.Click += new EventHandler(insertText_Click);
Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que a mensagem Hello World! aparece na caixa de texto quando voc clica no boto. Para testar sua pasta de trabalho 4. 5. 6. Pressione F5 para executar o projeto. Clique no boto. Confirme que Hello World! aparece na caixa de texto. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em planilhas do Excel. Aqui esto algumas tarefas que podem vie em seguida:
Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usar caixas de seleo para alterar a formatao. Para obter mais informaes, consulte Alterando planilha formatao usando controles CheckBox Walkthrough:.
Visual C# Consolidado
1088
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.
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,
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.
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
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
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.
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:.
Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos
Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o 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.
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.
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.
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.
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.
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
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.
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.
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.
6.
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.
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(); }
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(); }
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(); }
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.
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.
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
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.
Visual C# Consolidado
1100
so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource,
A prxima etapa para adicionar texto ao boto quando a planilha abre. Inicializao do controle Adicionar texto ao boto no manipulador Startup de eventos.
Ao inicializar o controle
4. 5. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para o b utton. C#
this.button1.Text = "Save";
6.
C#
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.
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.
Pressione F5. Verifique que quando abrir a pasta de trabalho, o objeto lista preenchido com dados da tabela Employees.
Visual C# Consolidado
1102
6.
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:.
Adicionar controles a uma planilha. Configurar um DataSet para ser armazenados em uma planilha. Adicione cdigo para Habilitar rolagem pelos registros. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual C# Consolidado
1103
Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Acesso ao exemplo de SQL Server do Northwind. O banco de dados pode ser no seu computador de desenvolvimento ou em um servidor. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto
Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome My Master-Detail, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My MasterDetail projeto para Solution Explorer. Criando o DataSet Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.
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.
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.
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.
Visual C# Consolidado
1105
6.
C#
this.button1.Click += new EventHandler(button1_Click); this.button2.Click += new EventHandler(button2_Click);
Adicionar cdigo para ativar rolagem atravs dos registros Adicione cdigo ao manipulador Click de eventos de cada boto para percorrer os registros. Para percorrer os registros 3. Adicionar um manipulador de eventos para o Click evento de Button1, e adicione o cdigo a seguir para percorrer os registros para trs: C#
private void button1_Click(object sender, EventArgs e) { this.ordersBindingSource.MovePrevious(); }
4.
Adicionar um manipulador de eventos para o Click evento de Button2, e adicione o cdigo a seguir para avanar pelos registros: C#
private void button2_Click(object sender, EventArgs e) { this.ordersBindingSource.MoveNext(); }
Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se de que os dados aparecem como esperado, e que voc pode usar a soluo off-line. Para testar o cache de dados 9. Pressione F5. 10. Verifique que o intervalo nomeado e o objeto lista so preenchidos com dados da fonte de dados. 11. Rolar pelos alguns dos registros clicando nos botes. 12. Pasta de trabalho, salve e feche a pasta de trabalho e Visual Studio. 13. Desativar a conexo ao banco de dados. Desconecte o cabo de rede do seu computador se o banco de dados estiver localizado em um servidor, ou parar o servio SQL Server se o banco de dados for no seu computador de desenvolvimento. 14. Abra o Excel, e abra My Master-Detail.xls a partir do diretrio \bin (\My Detail\bin mestreno Visual Basic) ou \My Detail\bin\debug mestre-em C#. 15. Rolar pelos alguns dos registros para ver que a planilha opera normalmente quando desconectado. 16. Reconectar-se ao banco de dados. Conectar-se seu computador rede novamente se o banco de dados estiver localizado em um servidor, ou inicia o servio SQL Server se o banco de dados for no seu computador de desenvolvimento. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de criar uma relao mestre / detalhes de dados em uma planilha e cache um DataSet. Aqui esto algumas tarefas que podem vie em seguida:
Visual C# Consolidado
1106
Implantar a soluo. Para obter mais informaes, consulte Como implantar solues do Office:. Recuperar dados de cache para outro projeto. Para obter mais informaes, consulte Como recuperar dados de uma pasta de trabalho em um servidor em cache:.
Adicionar um controle de usurio para uma planilha. Alterar o estilo do grfico quando uma opo est selecionada. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Adicionar um grfico a uma planilha
Voc pode criar um projeto de pasta de trabalho do Excel usando uma pasta de trabalho existente. Nessa explicao passo a passo, ir adicionar um grfico pasta de trabalho e Usar pasta de trabalho no Excel uma nova soluo. A fonte de dados nessa explicao passo a passo uma planilha chamada Data for Chart. Para adicionar os dados 5. 6. 7. 8. Abra o Excel 2003. Abre uma nova pasta de trabalho. Clique com o boto direito do mouse na Sheet3 guia e, em seguida clique Rename no menu de atalho. Renomear a planilha para Data for Chart. Adicionar dados Data for Chart Os seguir com clula A4 sendo a parte superior esquerda E8 Canto, e o canto inferior direito: Q1 Q2 Q3 Q4
Visual C# Consolidado
1107
Em seguida, adicione o grfico para a primeira planilha. Para adicionar um grfico 12. No menu Insert, clique em Chart. O Chart Wizard abre. 13. Clique em Next, deixando os padres selecionados. 14. Clique na caixa Data Range e desmarque qualquer seleo padro. 15. Na planilha Data for Chart, selecionar o bloco de clulas que contm os nmeros, que inclui A4 no canto esquerdo superior para E8 no canto direito inferior. 16. Para aceitar todos os padres para Step 3, clique Next em Next novamente. 17. No Step 4, garantir que As object in: est selecionado. 18. Na lista As object in:, selecione Sheet1. 19. Clique em Finish. 20. Reposicionar o grfico para que o canto direito superior alinhe com Clula E2. 21. Salve o arquivo para a unidade C: e nome-la ExcelChart.xls. 22. Feche o Excel. Criando um novo projeto Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel. Para criar um novo projeto 4. Criar um projeto de pasta de trabalho do Excel com o nome My Excel Chart. Verifique que Copy an existing document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Clique no Browse boto e v para a pasta de trabalho que voc criou anteriormente nessa explicao passo a passo. Clique em OK. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Chart projeto para Solution Explorer. Definindo Propriedades do grfico Quando voc criar um novo projeto pasta de trabalho do Excel usando uma pasta de trabalho existente, controles host automaticamente so criados para intervalos nomeados, objetos lista, e grficos que existem dentro da pasta de trabalho. Voc pode alterar o nome do controle Chart usando a Properties janela
5. 6.
Visual C# Consolidado
1108
Selecione o Chart controle no designer e alterar as seguintes propriedades na janela Properties: Propriedade Name HasLegend Adicionar um controle de usurio ao projeto Value (Valor) dataChart False
Para adicionar um controle de usurio 4. 5. 6. Selecione o My Excel Chart projeto no Solution Explorer. No menu Project, clique em Add New Item. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions, e clique em Add Se o controle de usurio estiver no visvel no designer, clique duas vezes em ChartOptions no Solution Explorer. Na guia Common Controls Da arraste um Radio Button controle para o controle de usurio, e alterar as seguintes propriedades: o Toolbox, Propriedade Name Text 8. Value (Valor) columnChart Grfico de coluna
Adicionar um boto de opo segundo para o controle de usurio, e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) barChart Grfico de barras
9.
Adicionar um boto de opo terceiro para o controle de usurio, e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) lineChart Grfico de linha
Visual C# Consolidado
1109
10. Adicionar um boto de opo quarto para o controle de usurio, e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) areaBlockChart Grfico bloquear de rea
Em seguida, escreva o cdigo para atualizar o grfico quando um boto de opo clicado. Alterar o grfico estilo quando um boto de opo selecionada Nesta seo, voc ser criar um evento pblico sobre o controle de usurio, adicionar uma propriedade para definir o tipo de seleo, e criar um manipulador de eventos para o CheckedChanged evento de cada um dos botes de opo. Para criar um evento e propriedade em um controle de usurio 3. 4. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e selecione View Code. Adicione cdigo para criar um SelectionChanged evento e a Selection propriedade para a
ChartOptions classe:
C#
public event EventHandler SelectionChanged; private Microsoft.Office.Interop.Excel.XlChartType selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlColumnClustered; public Microsoft.Office.Interop.Excel.XlChartType Selection { get { return this.selectedType; } set { this.selectedType = value; } }
Para manipular o evento CheckedChanged dos botes de opo 6. Definir o tipo de grfico no manipulador CheckedChanged de eventos de boto areaBlockChart de opo e depois gerar o evento. C#
private void areaBlockChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlAreaStacked; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }
7.
8.
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.
10. Em C#, voc deve adicionar manipuladores de eventos para os botes de opo. Adicione o cdigo para o ChartOptions Construtor, sob a chamada para InitializeComponent, conforme mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
public ChartOptions() { InitializeComponent(); areaBlockChart.CheckedChanged += new EventHandler(areaBlockChart_CheckedChanged); barChart.CheckedChanged += new EventHandler(barChart_CheckedChanged); columnChart.CheckedChanged += new EventHandler(columnChart_CheckedChanged); lineChart.CheckedChanged += new EventHandler(lineChart_CheckedChanged); }
Adicionar o controle de usurio a planilha Quando voc cria a soluo, o novo controle de usurio automaticamente adicionado Toolbox. Voc pode, ento, arrastar o controle da Toolbox. para seu Worksheet Para adicionar o controle do usurio sua planilha 4. 5. 6. No menu Build, clique em Build Solution. O ChartOptions controle de usurio adicionado Toolbox. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs. e selecione View Designer Do Toolbox arraste o ChartOptions controle de para a planilha. Um novo controle chamado ChartOptions1 adicionado ao seu projeto. Alterar o tipo de grfico Nesta seo, criar um manipulador de eventos para alterar o tipo de grfico acordo para a opo selecionada no controle de usurio. Para alterar o tipo de grfico que exibido na planilha 3. Adicionar o manipulador de eventos a seguir para a Sheet1 classe. C#
private void ChartOptions1_SelectionChanged(object sender, EventArgs e) { try { dataChart.ChartType = this.ChartOptions1.Selection; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
Visual C# Consolidado
1111
4.
Em C#, adicione um manipulador de eventos para o controle de usurio para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.ChartOptions1.SelectionChanged += new EventHandler(ChartOptions1_SelectionChanged);
Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que o grfico tiver estilo corretamente quando voc seleciona um boto de opo. Para testar sua pasta de trabalho 4. 5. 6. Pressione F5 para executar o projeto. Selecione vrios botes de opo. Confirme que o estilo do grfico altera para correspondem seleo. Prximas etapas Essa explicao passo a passo mostra noes bsicas sobre como usar botes de opo e estilos do grfico nas planilhas do Excel 2003. Aqui esto algumas tarefas que podem vie em seguida:
Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough:. Alterar a formatao em uma planilha usando caixas de seleo. Para obter mais informaes, consulte Alterando planilha formatao usando controles CheckBox Walkthrough:.
Adicionar controles a uma planilha. Criar um controle painel Aes. Adicionar controles Windows Forms ligados a dados a um controle painel Aes. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto. Observao
Visual C# Consolidado
1112
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Acesso a um servidor com o exemplo de SQL Server do Northwind. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto
A primeira etapa para criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome My Excel Actions Pane. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Actions Pane projeto para Solution Explorer. Adicionar uma nova fonte de dados ao projeto
Para adicionar uma nova fonte de dados para o projeto 10. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu. Observao Se Show Data Sources clique dentro na planilha do Excel e depois verificar novamente. no estiver disponvel, 11. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. 12. Selecione Database e, em seguida clique em Next. 13. Selecionar uma conexo de dados ao banco de dados de exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 14. Clique em Next. 15. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. 16. Expanda o Tables n na janela Database objects. 17. Marque a caixa de seleo ao lado da Suppliers tabela. 18. Expandir a Products tabela e selecione ProductName, SupplierID, QuantityPerUnit. e UnitPrice 19. Clique em Finish. O assistente adiciona a Suppliers tabela e Products Tabela janela Data Sources. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer.
Visual C# Consolidado
1113
Adicionar controles a planilha Em seguida, adicione um NamedRange controle e um ListObject controle primeira planilha. Para adicionar um NamedRange e um controle ListObject 8. 9. Verifique se a My Excel Actions Pane.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Na janela Data Sources , expanda a Suppliers tabela.
10. Clique na seta suspensa no n Company Name, e selecione NamedRange. 11. Arraste Company Name a partir da Data Sources janela para na Sheet1 Clula A2. Um NamedRange controle denominado CompanyNameNamedRange criado, e o <CompanyName> de texto aparece na clula A2. Ao mesmo tempo, nomeado suppliersBindingSource, um adaptador de tabela, e um DataSet so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 12. Na janela Data Sources, role para baixo aps as colunas que esto sob a Suppliers tabela. Na parte inferior da lista a Products tabela; ele aqui porque ele um filho da Suppliers tabela. Selecionar esta Products Tabela, no a um que seja no mesmo nvel como a Suppliers Tabela, e clique a seta suspensa que aparece. 13. Clique ListObject na lista drop-down, e arraste a Products tabela para clulas A6 em Sheet1. Um ListObject controle denominado ProductNameListObject criado na clula A6. Ao mesmo tempo, e um adaptador de tabela so adicionados ao projeto. nomeado productsBindingSource, um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 14. No C# somente, selecione suppliersBindingSource No bandeja de componentes, e alterar a Modifiers propriedade para Internal na janela Properties. Adicionar controles ao painel de aes Em seguida, voc precisa um controle painel Aes que contenha uma caixa de combinao. Para adicionar um controle painel Aes 4. 5. 6. Selecione o My Excel Actions Pane projeto no Solution Explorer. No menu Project, selecione Add New Item. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la ActionsControl e clique em Add Das Common Controls guias da Toolbox, arraste um ComboBox controle para o controle painel Aes. Alterar a Size propriedade para 171, 21. Redimensionar o controle de usurio para ajustar os controles. Vinculando o controle no painel Aes a dados Neste seo, voc ser definir a fonte de dados de mesma fonte de dados como o NamedRange controle em uma planilha.. com a mesma fonte de dados que o NamedRange controle em uma planilha o ComboBox o ComboBox
Para adicionar controles Windows Forms ligados a dados a um controle painel Aes 4. 5. 6.
Visual C# Consolidado
1114
Para definir propriedades de vinculao de dados do controle 4. 5. Clique com o boto direito do mouse no controle painel Aes e selecione View Code a partir do menu de atalho Adicione o seguinte cdigo ao evento Load do controle painel Aes: C#
private void ActionsControl_Load(object sender, EventArgs e) { this.comboBox1.DataSource = Globals.Sheet1.suppliersBindingSource; this.comboBox1.DisplayMember = "CompanyName"; }
6.
Em C#, voc deve criar um manipulador de eventos para o ActionsControl. Voc pode colocar este cdigo no construtor ActionsControl como mostrado abaixo. Para obter mais informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
public ActionsControl() { InitializeComponent(); this.Load += new EventHandler(ActionsControl_Load); }
Mostrando o Painel de Aes Voc nesta seo, vai escrever cdigo para mostrar o painel Aes. O painel Actions ficar visvel depois controles so adicionados a ele. Para mostrar o painel Aes 3. 4. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Criar uma nova instncia do controle do usurio na classe ThisWorkbook, da seguinte maneira: C#
ActionsControl actions = new ActionsControl();
5.
No manipulador Startup de eventos de ThisWorkbook, adicione cdigo de forma que ele tenha como no exemplo a seguir: C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { this.ActionsPane.Controls.Add(actions); }
Testar o aplicativo Agora voc pode testar seu documento para verificar o painel Aes que aberto quando o documento for aberto. Voc testar para a relao mestre / detalhes entre os controles no painel de aes e os controles da planilha. Para testar seu documento 5. 6. 7. 8. Pressione F5 para executar o projeto. Confirme se o painel Actions est visvel. Selecione uma empresa na caixa Lista. Verifique se o nome da empresa est listado no controle NamedRange e se os detalhes do produto esto listados no ListObject controle. Selecione vrias empresas para verificar o nome da empresa e Detalhes do Produto altere conforme apropriado. Prximas etapas
Visual C# Consolidado
1115
Essa explicao passo a passo mostra as noes bsicas de vinculao de dados a controles em um painel Aes no Excel. Aqui esto algumas tarefas que podem vie em seguida:
Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Ligao de dados a controles no Word. Para obter mais informaes, consulte Vinculao de Dados para controles em um painel Aes do Word Walkthrough:. Mostrar e ocultar controles no painel de aes. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:
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 Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo pressupe que voc estiver implantando uma soluo Word. Se voc quiser executar explicao passo a passo com uma soluo Excel, o substitua o nome do
Visual C# Consolidado
1116
projeto do Word com o nome do seu projeto do Excel em todos os cdigos e exemplos XML.
Acesso a um servidor de rede para implantao. Essa explicao passo a passo pressupe que voc so redeploying sua soluo para o \\DeployServer\ShareFolder compartilhamento de rede. Privilgios de administrador no computador de desenvolvimento, para que voc possa definir a diretiva de segurana para um local de rede. Criando o projeto
Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto
Criar um projeto Documento do Word com o nome WordDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
Abre o novo documento do Word no designer e adiciona o WordDeployment projeto para Solution Explorer o Visual Studio. Adicionar cdigo para trs o documento Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos do documento. Isso permitir que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisDocument classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisDocument_Startup(object sender, System.EventArgs e) { MessageBox.Show("The document is deployed correctly."); }
8. 9.
Pressione F5 para executar o projeto. Inicia o Word e a caixa de mensagem aparece. Fechar a caixa de mensagem.
10. Sair do Word. Em seguida, voc publicar nesta soluo. Publicando a soluo Nesta etapa, voc publicar a soluo em um local temporrio no computador local. Para publicar a soluo 6. 7. Clique com o boto direito do mouse o n de projeto no Solution Explorer. Clique Publish no menu de atalho. O Publish Wizard aparece.
Visual C# Consolidado
1117
8. 9.
Na caixa Specify the location to publish this application, digite C:\TestDeploy. Clique em Finish. O documento de Soluo e manifesto de implantao so copiados para C:\TestDeploy. O conjunto de soluo, atualizado manifesto do aplicativo, e cpias do documento de Soluo e manifesto de implantao so copiadas para C:\TestDeploy\WordDeployment_1.0.0.0. Para obter mais informaes, consulte Implantando o Word e Excel Solutions.
10. Feche o WordDeployment projeto no Visual Studio. Observao O conjunto no tem permisso para executar ainda, para que ele se voc tentar executar a soluo ser lanar um erro. Voc ir atualizar sua diretiva de segurana para conceder permisso de confiana total ao conjunto em uma etapa posterior. Quando voc publicar uma soluo, o manifesto do aplicativo incorporado no aponta de documento de soluo para o caminho completo da manifesto de implantao. Se voc relanamento os arquivos de soluo para outro local, dever atualizar o manifesto do aplicativo incorporado para apontar para a nova localizao da manifesto de implantao. Voc tambm deve atualizar a manifesto de implantao e o manifesto do aplicativo externo para apontar para os novos locais de arquivo. Atualizando o manifesto Application incorporados Para editar o manifesto do aplicativo incorporado, use a ServerDocument classe que Visual Studio Tools for Office fornece. Quando voc usa a ServerDocument classe, voc deve executar o cdigo em um novo projeto (no a Visual Studio Tools for Office Soluo), como um projeto de console, e o Visual Studio Tools for Office documento de soluo deve ser fechado. Observao Inclui Visual Studio Tools for Office um exemplo que demonstre como criar uma ferramenta que pode ser usada para editar o manifesto do aplicativo incorporado. Para obter mais informaes, consulte Aplicativo Manifest exemplo Editor. Para atualizar o manifesto do aplicativo incorporado 6. 7. 8. Criar um novo projeto Console Application. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e System.Windows.Forms montagens para este projeto. Abra o arquivo Program.cs ou Module1.vb, e adicione a seguinte Imports ou using instruo para o topo do arquivo. C#
using Microsoft.VisualStudio.Tools.Applications.Runtime;
9.
Copie o cdigo a seguir para a Main funo. Este cdigo cria uma ServerDocument que fornece acesso ao manifesto do aplicativo incorporado de seu documento de soluo. O cdigo atribui o novo caminho manifesto de implantao para a DeployManifestPath propriedade, e salva e fecha o ServerDocument.. o ServerDocument C#
Visual C# Consolidado
1118
ServerDocument sd = null; try { sd = new ServerDocument(@"C:\TestDeploy\WordDeployment.doc"); sd.AppManifest.DeployManifestPath = @"\\DeployServer\ShareFolder\WordDeployment.application"; sd.Save(); } finally { if (sd != null) { sd.Close(); } }
10. Pressione F5 para executar o projeto. Uma janela do console aparece rapidamente enquanto o manifesto do aplicativo incorporado est sendo atualizado, e fecha a janela do console. Atualizando o manifesto de implantao Agora que voc atualizou o manifesto do aplicativo incorporado no documento Visual Studio Tools for Office de soluo, voc deve atualizar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Para atualizar a manifesto de implantao 4. Abra a manifesto de implantao em um editor de texto, como o Bloco de notas. A manifesto de implantao denominado WordDeployment.application, e est localizado na pasta C:\TestDeploy de publicao. Defina o codebase atributo do elemento <dependentAssembly> como o caminho completo da localizao implantao final do manifesto do aplicativo externos. Para obter mais informaes, consulte <dependentAssembly> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll.manifest"
5.
6.
Alm disso, para atualizar a manifesto de implantao, voc tambm deve editar o manifesto do aplicativo externo para apontar para os locais implantao final do conjunto de soluo e a manifesto de implantao. Sempre que voc publicar uma Visual Studio Tools for Office soluo, um novo manifesto do aplicativo externo gerado que aponta para a verso atual do conjunto de soluo. Para atualizar o manifesto do aplicativo externo 5. Abra o manifesto do aplicativo em um editor de texto, como o Bloco de notas. O manifesto do aplicativo denominado WordDeployment.dll.manifest, e est localizado na pasta C:\TestDeploy\WordDeployment_1.0.0.0 de publicao. Localize o <installFrom> elemento que est o filho do elemento <dependency>, e defina o codebase atributo como o caminho completo da montagem de soluo atual. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll"
6.
7.
Localize o <installFrom> elemento que est o filho do elemento <assembly>, e defina o codebase atributo para o caminho completo do manifesto de implantao. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\WordDeployment.application"
8.
Visual C# Consolidado
1119
Copiando os arquivos da soluo para o servidor Agora que voc tiver editado os manifestos, voc est pronto para copiar os arquivos de soluo para o servidor. Para copiar os arquivos de soluo para o servidor 4. 5. 6. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder compartilhamento de arquivos de rede. Copiar o documento de Soluo e a manifesto de implantao para \\DeployServer\ShareFolder. Copiar o conjunto de soluo e o manifesto do aplicativo para \\DeployServer\ShareFolder\WordDeployment_1.0.0.0. Conceder confiana total para a pasta de rede Para execute sua Visual Studio Tools for Office soluo a partir da pasta de rede, voc deve conceder confiana total para a pasta de rede na sua diretiva de segurana no computador de desenvolvimento. Voc pode modificar a diretiva de segurana de um prompt de comando usando a ferramenta Diretiva de Segurana para Acesso ao Cdigo (Caspol.exe). Para conceder confiana para um local de rede, voc deve ter privilgios de administrador e voc dever alterar a diretiva de segurana no nvel do computador. Observao Este procedimento destinado a fim de executar essa explicao passo a passo. No use este procedimento para conceder confiana a conjuntos ou diretrios se no tiver certeza que sejam segura e protegida. Para obter mais informaes sobre concesso e remover permisses, consulte HOW TO: conceder permisses para pastas e montagens e Como remover permisses de pastas e montagens:. Para conceder confiana total para a pasta de rede
Testando a soluo Agora voc pode testar sua soluo para certificar-se que seu cdigo seja executado quando voc abre o documento a partir do computador de desenvolvimento. Para testar a implantao 3. 4. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no \\DeployServer\ShareFolder\. Confirme se a caixa de mensagem aparece. Prximas etapas Voc tambm pode implantar a soluo usando um arquivo do Microsoft Windows Installer (.msi). Para obter mais informaes, consulte Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:.
Visual C# Consolidado
1120
Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo. Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.
Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues.
Visual C# Consolidado
1121
Criando o projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome ExcelDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o ExcelDeployment projeto para Solution Explorer. Adicionar cdigo para trs a pasta de trabalho Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos da pasta de trabalho. Isso permite que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisWorkbook classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); }
8. 9.
Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem.
10. Saia do Excel. Em seguida, voc adicionar um projeto de instalao para sua soluo. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos. Para criar um projeto de instalao para a soluo 7. 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda Other Project types e selecione Setup and Deployment.
10. No painel Templates, selecione Setup project. 11. Nome do projeto ExcelSetup. 12. Clique em OK.
Visual C# Consolidado
1122
O projeto instalao aparece no Solution Explorer. Por padro, o arquivo que voc ir criar usando este projeto instalao Windows Installer inclui uma caixa de dilogo que permite ao usurio final que especifique o local de instalao da soluo. Para obter mais informaes, consulte Caixa de dilogo interface do usurio da pasta de instalao. Adicionar o pasta de trabalho e assembly da soluo para o Project da instalao Nesta etapa, voc adicionar a sada do projeto ExcelDeployment principal para o projeto de instalao. A sada do projeto ExcelDeployment principal consiste de pasta de trabalho e o conjunto de soluo. Para adicionar o documento e conjunto ao projeto de instalao 10. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 11. Selecione View no menu de atalho, e depois clique em File System. 12. Clique com o boto direito do mouse Application Folder no painel esquerdo. 13. Aponte para Add no menu de atalho, e clique em Project Output. 14. Selecione ExcelDeployment na caixa Project. 15. Selecione Primary output na lista de tipos de sada. 16. Clique em OK. A sada do projeto e dependncias aparecem no painel direito. 17. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n de projeto. 18. Clique com boto direito mouse cada dependncia, exceto para Microsoft .NET Framework, e clique Exclude no menu de atalho. Criar um projeto de ao personalizada Nesta etapa, voc ir criar um projeto que contm aes personalizadas para o projeto de instalao. Aes personalizadas so um recurso do Windows Installer que permitem a voc para executar cdigo no final de uma instalao para executar aes que no podem ser executadas durante a instalao. Para obter mais informaes, consulte Aes Personalizadas. Para criar um projeto ao personalizada 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. 10. No painel Project types, expanda o n para a linguagem de programao, e selecione Windows. 11. No painel Templates, selecione Class Library. 12. Nome do projeto ExcelCustomAction. 13. Clique em OK. O novo projeto aparece na Solution Explorer. 14. No Solution Explorer, clique com o boto direito do mouse Class1.vb ou Class1.cs sob o ExcelCustomAction projeto e, em seguida, clique em Delete. Este arquivo desnecessrio para essa explicao passo a passo. Criar uma ao personalizada que salvas o manifesto de aplicativo
Visual C# Consolidado
1123
Quando voc executava seu projeto anteriormente nessa explicao passo a passo pelo pressionamento F5, a processo de criao editado o manifesto do aplicativo incorporado na pasta de trabalho para aponte para o caminho relativo do conjunto. Se a pasta de trabalho e o conjunto permanecer na mesma pasta aps a instalao, ento voc no precisam modificar o manifesto do aplicativo incorporado, e voc pode ignorar esta seo. No entanto, se voc quiser que o usurio possa mover a pasta de trabalho para uma pasta diferente aps a instalao, voc deve editar o manifesto do aplicativo para apontar para o caminho completo da montagem. Voc deve atualizar o manifesto do aplicativo que est incorporado no Visual Studio Tools for Office documento de Soluo ao executar uma ao personalizada aps a instalao, porque o local do conjunto de soluo desconhecido at que o usurio especifica o local durante a instalao. Editar o manifesto do aplicativo incorporado, usando a ServerDocument classe. Para usar a ServerDocument classe no projeto de instalao, adicione cdigo para uma Installer classe dentro do projeto ao personalizada. Para criar uma ao personalizada que edita o manifesto do aplicativo 9. Clique com o ExcelCustomAction projeto no Solution Explorer. A Add New Item caixa de dilogo ser exibida. 11. Selecionar Installer Class, e nome da classe ManifestEditor. 12. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime para o ExcelCustomAction projeto. 13. Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer, ou ManifestEditor.vb arquivo e clique em View Code. 14. Adicione a instruo seguinte Imports ou using para o topo do arquivo de cdigo. C#
using Microsoft.VisualStudio.Tools.Applications.Runtime;
15. Copie o cdigo a seguir para a ManifestEditor classe. Esse cdigo substitui o Install mtodo, que usado para executar aes Instalao personalizada. O cdigo define o local de instalao especificado pelo usurio para a AssemblyPath propriedade. O caminho de instalao especificado pelo usurio e os nomes do documento e conjunto so obtidas a partir da Parameters propriedade. C#
// Override the Install method to update the customization location // in the application manifest. public override void Install(System.Collections.IDictionary stateSaver) { UpdateApplicationManifest(); base.Install(stateSaver); } // Update the application manifest according to the the install location. private void UpdateApplicationManifest() { // Get the parameters passed to the task. string targetDir = this.Context.Parameters["targetdir"]; string documentName = this.Context.Parameters["documentname"]; string assemblyName = this.Context.Parameters["assemblyname"]; // Get the application manifest from the document. string documentPath = System.IO.Path.Combine(targetDir, documentName); ServerDocument serverDocument1 = new ServerDocument(documentPath, System.IO.FileAccess.ReadWrite); try { AppManifest appManifest1 = serverDocument1.AppManifest; string assemblyPath = System.IO.Path.Combine(targetDir, assemblyName); appManifest1.Dependency.AssemblyPath = assemblyPath; serverDocument1.Save(); } finally { if (serverDocument1 != null) { serverDocument1.Close(); } } }
Visual C# Consolidado
1124
16. Clique com o ExcelCustomAction projeto no Solution Explorer, e, em seguida clique em Build. Adicionando a ao personalizada ao projeto de instalao Nesta etapa, voc adicionar a sada do projeto ExcelCustomAction principal para o projeto de instalao. Isso permite que o arquivo Windows Installer para executar a ao personalizada que edita o manifesto do aplicativo. Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao 12. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 13. Aponte para View no menu de atalho, e clique em Custom Actions. 14. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add Custom Action. 15. Na caixa Look In Selecionar Application Folder, e clique em Add Output 16. Selecione ExcelCustomAction na caixa Project. 17. Selecione Primary output na lista de tipos de sada, e depois clique em OK. 18. Verifique que Primary output from ExcelCustomAction (Active) foi adicionado lista de sadas primria para o projeto de instalao e clique em OK 19. Em expandir Install. o Custom Actions Editor, 20. Clique com o boto direito do mouse Primary output from ExcelCustomAction (Active) e, em seguida clique em Properties Window. 21. Na janela Properties, defina a CustomActionData propriedade para a seguinte seqncia:
/targetdir="[TARGETDIR]/" /documentname="ExcelDeployment.xls" /assemblyname="ExcelDeployment.dll"
Para obter informaes sobre a CustomActionData propriedade, consulte Propriedade CustomActionData. 22. Clique com o boto direito do mouse e, em seguida clique em Build. Em Solution Explorer, o ExcelSetup project Teste a instalao Agora voc pode testar a soluo para garantir que sua soluo instalada quando voc executar o arquivo do Windows Installer no seu computador de desenvolvimento. Para testar a instalao 5. 6. 7. 8. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution Explorer, o ExcelSetup project Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no seu computador de desenvolvimento. Abrir a pasta de trabalho do Excel a partir da pasta de instalao. Confirme se a caixa de mensagem aparece.
Visual C# Consolidado
1125
Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos
Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto
Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha. Para adicionar uma caixa de mensagem a um evento de inicializao 12. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. 13. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho 14. Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#
private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); }
15. No menu File, clique em Save All. 16. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. 17. Clique em Save.
Visual C# Consolidado
1126
18. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. 19. Fechar a caixa de mensagem. 20. Feche o Excel. 21. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 22. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado. Para remover um grupo de cdigos 9. No Painel de Controle, abra Administrative Tools. 10. Executar Microsoft .NET Framework 2.0 Configuration. 11. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 12. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho. Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 13. Clique em Yes. 14. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 15. Clique em OK. 16. Feche o Excel. O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto
Visual C# Consolidado
1127
Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas. Para criar um nome forte 9. No menu Project no Visual Studio, clique em My Security Test Properties. 10. Clique na Signing guia. 11. Selecione Sign the assembly. 12. No, o Choose a strong name key file list clique New. 13. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. 14. Desmarque a Protect my key file with a password caixa de seleo. 15. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. 16. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte. Para conceder confiana com base em nome forte 10. Abra Microsoft .NET Framework 2.0 Configuration novamente. 11. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho 12. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. 13. Na lista Choose the condition type for this code group, clique Strong Name. 14. Clique em Import. 15. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open. 16. Clique em Next. 17. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. 18. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta. Para testar sua pasta de trabalho 3. 4. Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.
Visual C# Consolidado
1128
Adicione texto e um controle a um documento. Formate o texto quando uma opo selecionada. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto
Neste procedimento, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word. Para criar um novo projeto
Criar um projeto Documento do Word com o nome My Word Formatting. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Formatting projeto para Solution Explorer o Visual Studio. Adicionar texto e controles ao documento do Word
Visual C# Consolidado
1129
Para essa explicao passo a passo, voc precisar trs caixas de seleo e algum texto em um Bookmark controle no documento do Word. Para adicionar trs caixas de seleo 10. Verifique se o documento est aberto no designer visual studio. 11. Na Common Controls guia e arraste-o para o documento. da Toolbox, arraste um CheckBox 12. No menu View, selecione Properties Window. 13. Certifique-se de que que Checkbox1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Propriedade Name Text Value (Valor) applyBoldFont Negrito
14. Pressione Enter para mover o ponto de insero abaixo da primeira caixa de seleo. 15. Adicionar uma segunda caixa de seleo para o documento abaixo da ApplyBoldFont caixa de seleo e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) applyItalicFont Itlico
16. Pressione Enter para mover o ponto de insero abaixo da segunda caixa de seleo. 17. Adicionar uma caixa de seleo terceira para o documento abaixo da ApplyItalicFont caixa de seleo e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) applyUnderlineFont Sublinhado
18. Voc em seguida, ser arrastar o Bookmark controle para o documento. Observao Voc tambm pode adicionar o Bookmark controle usando a Bookmark caixa de dilogo, encontrada no menu Insert. Para adicionar texto e um controle indicador 5. Mover o ponto de insero abaixo os controles caixa de seleo e digite o seguinte texto no documento:
Visual C# Consolidado
1130
Clique em uma caixa de seleo para alterar a formatao de texto. 6. 7. Na guia Word Controls na Toolbox, arraste um Bookmark controle para o documento. A Add Bookmark Control caixa de dilogo ser exibida. Selecione o texto adicionado ao documento e clique em OK. Um Bookmark controle denominado Bookmark1 adicionado ao texto selecionado no documento. 8. Certifique-se de que que Bookmark1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e alterar a propriedade Nome para fontText.
Em seguida, escreva o cdigo para formatar o texto quando uma caixa de seleo marcada ou desmarcada. Formatao a caixa de texto quando a verificao checked ou Cleared Quando o usurio seleciona uma opo de formatao, alterar o formato do texto no documento. Para alterar a formatao quando uma caixa de seleo marcada 7. 8. Clique com o boto direito do mouse ThisDocument no Solution Explorer, e, em seguida clique View Code no menu de atalho. No C# somente, adicionar as constantes a seguir para a ThisDocument classe: C#
const int WordTrue = -1; const int WordFalse = 0;
9.
10. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyItalicFont de seleo: C#
private void applyItalicFont_Click(object sender, System.EventArgs e) { if (this.applyItalicFont.Checked == true) { this.fontText.Italic = WordTrue; } else { this.fontText.Italic = WordFalse; } }
11. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyUnderlineFont de seleo: C#
private void applyUnderlineFont_Click(object sender, System.EventArgs e) { if (this.applyUnderlineFont.Checked == true) { this.fontText.Underline = Word.WdUnderline.wdUnderlineSingle; } else { this.fontText.Underline = Word.WdUnderline.wdUnderlineNone; } }
12. Em C#, adicione manipuladores de eventos para as caixas de texto para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de
Visual C# Consolidado
1131
eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.applyBoldFont.Click += new EventHandler(applyBoldFont_Click); this.applyItalicFont.Click += new EventHandler(applyItalicFont_Click); this.applyUnderlineFont.Click += new EventHandler(applyUnderlineFont_Click);
Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o texto est formatado corretamente quando voc marca ou desmarca uma caixa de seleo. Para testar seu documento 4. 5. 6. Pressione F5 para executar o projeto. Marque ou desmarque uma caixa de seleo. Confirme que o texto est formatado corretamente. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de usando caixas de seleo e programaticamente alterar texto formatao em documentos do Word. Aqui esto algumas tarefas que podem vie em seguida:
Implantao do projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:.
Adicionar controles ao documento do Word. Preencher uma caixa de texto quando um boto clicado. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual C# Consolidado
1132
Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto
Nesta etapa, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word. Para criar um novo projeto
Criar um projeto Documento do Word com o nome My Word Button. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Button projeto para Solution Explorer o Visual Studio. Adicionar controles ao documento do Word
Nesta seo, voc adicionar um boto e uma caixa de texto para o documento Word. Para adicionar um boto e uma caixa de texto 6. 7. Verifique se o documento est aberto no designer visual studio. Na guia Common Controls da Toolbox, arraste um TextBox controle para o documento. Observao No Word, controles so ignorados na linha com texto por padro. Voc pode modificar, controles forma, bem como objetos forma, so inseridos na guia Edit da caixa Options de dilogo. 8. 9. No menu View, selecione Properties Window. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a Name propriedade da caixa de texto para displayText.
10. Arraste um Button controle para o documento e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) insertText Inserir texto
Agora Escreva o cdigo a ser executado quando o boto clicado. Preencher a caixa de texto quando o boto Clicked Sempre que o usurio clica no boto, Hello World! acrescentada caixa de texto. Para escrever para a caixa de texto quando o boto clicado 4. 5. Na Solution Explorer, clique com o boto direito do mouse ThisDocument e, em seguida clique View Code no menu de atalho. Adicione o seguinte cdigo ao manipulador Click de eventos do boto: C#
Visual C# Consolidado
1133
6.
Em C#, adicione um manipulador de eventos para o boto para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.insertText.Click += new EventHandler(insertText_Click);
Testar o aplicativo Agora voc pode testar seu documento para certificar-se que a mensagem Hello World! aparece na caixa de texto quando voc clica no boto. Para testar seu documento 4. 5. 6. Pressione F5 para executar o projeto. Clique no boto. Confirme que Hello World! aparece na caixa de texto. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em documentos do Word. Aqui esto algumas tarefas que podem vie em seguida:
Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usando uma caixa de combinao para alterar a formatao. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.
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
Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Criando o projeto
Nesta etapa, voc ir criar um projeto Documento do Word no Visual Studio. Para criar um novo projeto
Criar um projeto Documento do Word com o nome My Bookmark Shortcut Menu. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Bookmark Shortcut Menu projeto para Solution Explorer o Visual Studio. Adicionar texto e indicadores ao documento
Nesta etapa, voc ser adicionar texto ao seu documento do Word e depois adicionar dois indicadores. Para adicionar texto ao seu documento
Digite o seguinte texto em um documento do Word: Este um exemplo de criar um menu de atalho quando voc clica com o boto direito do mouse texto em um indicador.
Para adicionar um controle indicador ao seu documento 4. 5. Na guia Word Controls da Toolbox, arraste um Bookmark controle para o documento. A Add Bookmark Control caixa de dilogo ser exibida. Selecione as palavras creating a shortcut menu when you right-click the text no seu documento e clique em OK. bookmark1 adicionado ao documento. 6. Adicionar outro Bookmark controle com as palavras right-click the text in a bookmark. bookmark2 adicionado ao documento. Observao As palavras right-click the text aparecero no bookmark1 e bookmark2. Quando voc adicionar indicadores aos seus documentos Office Word 2003 no tempo de criao, um Bookmark controle criado que permite a voc para programa contra vrios eventos do indicador. Voc pode escrever cdigo no evento BeforeRightClick do indicador para que quando o usurio clica com o boto direito do mouse o texto dentro do indicador, um menu de atalho contendo itens de menu aparea. Criando o menu curto Para criar o menu de atalho 5. 6. No Solution Explorer, clique com o boto direito do mouse ThisDocument e selecione View Code. Declarar as CommandBar variveis e uma varivel do indicador no nvel de classe:
Visual C# Consolidado
1135
C#
private Office.CommandBar commandBar; private Office.CommandBarButton boldText; private Office.CommandBarButton italicText; private Microsoft.Office.Tools.Word.Bookmark selectedBookmark; const int WordTrue = -1; const int WordFalse = 0;
7.
8.
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
6.
Em C#, voc deve adicionar manipuladores de eventos para os controles do indicador ao Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.bookmark1.BeforeRightClick += new Microsoft.Office.Tools.Word. ClickEventHandler(showPopupMenu); this.bookmark2.BeforeRightClick += new Microsoft.Office.Tools.Word. ClickEventHandler(showPopupMenu);
Testar o aplicativo Nesta seo, voc ir testar seu documento para certificar-se de que os itens de menu negrito e itlico apaream no menu de atalho quando clicar com o boto direito do mouse texto em um indicador e o texto que est formatado corretamente. Para testar seu documento 6. 7. 8. 9. Pressione F5 para executar o projeto. Clique com o boto direito do mouse dentro do indicador e selecione Bold primeiro. Verificar se todos os o texto no bookmark1 formatados como negrito. Clique com o boto direito do mouse dentro do texto dos indicadores sobrepostos e selecione Italic.
10. Verificar se todos os o texto no bookmark2, mas somente essa parte do texto em bookmark1 que se sobreponha bookmark2 formatados como itlico. Prximas etapas Essa explicao passo a passo mostra como criar menus de atalho em indicadores. Aqui esto algumas tarefas que podem vie em seguida:
Escrever cdigo para responder a eventos de controles host no Excel. Para obter mais informaes, consulte Programao contra eventos de um controle NamedRange Walkthrough:. Use uma caixa de seleo para alterar formatao em um indicador. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.
Visual C# Consolidado
1137
Alterar o estilo do grfico quando uma opo est selecionada. Testar seu projeto. Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto
Nesta etapa, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word. Para criar um novo projeto
Criar um projeto Documento do Word com o nome My Chart Options. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Chart Options projeto para Solution Explorer o Visual Studio. Adicionar um grfico ao documento
Em seguida, adicione um grfico para o documento. Para adicionar um grfico 6. No menu Insert, clique em Object. A Object caixa de dilogo ser aberta. Observao Se o Insert menu no estiver visvel, voc dever primeiro clicar em dentro do documento para que ele foco. Para obter mais informaes consulte, Menus do Office no ambiente do Visual Studio. 7. Na lista Object type da guia Create New, selecione Microsoft Graph Chart e clique em OK Um grfico adicionado ao documento no ponto de insero, e a Datasheet janela exibida com alguns dados padro. 8. 9. Feche a Datasheet janela para aceite os valores padro no grfico e clique dentro do documento para mover foco fora do grfico. Clique com o boto direito do mouse no grfico e selecione Format Object.
10. Na guia Layout da caixa de dilogo, selecione Square e Format Object Clique em OK.
Visual C# Consolidado
1138
Adicionar um controle de usurio ao projeto Para adicionar um controle de usurio 4. 5. 6. Selecione o My Chart Options projeto no Solution Explorer. No menu Project, clique em Add New Item. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions, e clique em Add Se o controle de usurio estiver no visvel no designer, clique duas vezes em ChartOptions no Solution Explorer. Na guia Common Controls Da arraste um Radio Button controle para o controle de usurio, e alterar as seguintes propriedades: o Toolbox, Propriedade Name Text 8. Value (Valor) columnChart Grfico de coluna
Adicionar um segundo Radio Button ao controle de usurio, e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) barChart Grfico de barras
9.
Adicionar um terceiro Radio Button ao controle de usurio, e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) lineChart Grfico de linha
10. Adicionar um quarto Radio Button ao controle de usurio, e alterar as seguintes propriedades: Propriedade Name Text Adicionar Referncias Value (Valor) areaBlockChart Grfico bloquear de rea
Visual C# Consolidado
1139
Para acessar o grfico do controle de usurio em um documento, voc deve ter uma referncia 11.0 biblioteca objeto do Graph Microsoft no seu projeto. Para adicionar uma referncia 11.0 biblioteca objeto do Graph Microsoft 4. 5. 6. No menu Project, clique em Add Reference. A Add Reference caixa de dilogo ser exibida. Clique na COM guia. Selecione Microsoft Graph 11.0 Object Library na lista Component Name e clique em OK Alterar o estilo grfico quando o boto de opo selecionada Nesta seo, voc ser criar um evento pblico sobre o controle de usurio, adicionar uma propriedade para definir o tipo de seleo, e criar um procedimento para o CheckedChanged evento de cada um dos botes de opo. Para criar um evento e propriedade em um controle de usurio 3. 4. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e selecione View Code. Adicione cdigo para criar um SelectionChanged evento e a Selection propriedade para a ChartOptions classe: C#
public event EventHandler SelectionChanged; private Microsoft.Office.Interop.Graph.XlChartType selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlColumnClustered; public Microsoft.Office.Interop.Graph.XlChartType Selection { get { return this.selectedType; } set { this.selectedType = value; } }
Para manipular o evento CheckedChange dos botes de opo 6. Definir o tipo de grfico no manipulador CheckedChanged de eventos de boto areaBlockChart de opo e depois gerar o evento. C#
private void areaBlockChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlAreaStacked; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }
7.
8.
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.
10. Em C#, voc deve adicionar manipuladores de eventos para os botes de opo. Adicione o cdigo para o ChartOptions Construtor, sob a chamada para InitializeComponent, conforme mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
public ChartOptions() { InitializeComponent(); areaBlockChart.CheckedChanged += new EventHandler(areaBlockChart_CheckedChanged); barChart.CheckedChanged += new EventHandler(barChart_CheckedChanged); columnChart.CheckedChanged += new EventHandler(columnChart_CheckedChanged); lineChart.CheckedChanged += new EventHandler(lineChart_CheckedChanged); }
Adicionando o controle de usurio ao documento Quando voc cria a soluo, o novo controle de usurio automaticamente adicionado Toolbox. Do Toolbox Voc pode, ento, arrastar o controle de ao seu documento. Para adicionar o controle de usurio do documento 4. 5. 6. No menu Build, clique em Build Solution. O ChartOptions controle de usurio adicionado Toolbox. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs. e selecione View Designer Do Toolbox arraste o ChartOptions controle de para o documento. Um novo controle chamado ChartOptions1 adicionado ao seu projeto. Alterar o tipo de grfico Nesta seo, criar um manipulador de eventos para alterar o tipo de grfico acordo para a opo selecionada no controle de usurio. Para alterar o tipo de grfico que exibido no documento 3. Adicionar o manipulador de eventos a seguir para a ThisDocument classe. C#
private void ChartOptions1_SelectionChanged(object sender, EventArgs e) { try { //first object is the runtime storage control object index = 2; Word.Shape shape = this.Shapes.get_Item(ref index); //Activate the shape shape.Activate(); Microsoft.Office.Interop.Graph.Chart dataChart = (Microsoft.Office.Interop.Graph.Chart)shape.OLEFormat.Object; dataChart.ChartType =
Visual C# Consolidado
1141
4.
Em C#, adicione um manipulador de eventos para o controle de usurio para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.ChartOptions1.SelectionChanged += new EventHandler(ChartOptions1_SelectionChanged);
Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o estilo do grfico atualizado corretamente quando voc seleciona um boto de opo. Para testar seu documento 4. 5. 6. Pressione F5 para executar o projeto. Selecione vrios botes de opo. Confirme que o estilo do grfico altera para correspondem seleo. Prximas etapas Essa explicao passo a passo mostra noes bsicas de usando botes de opo e programaticamente alterando estilos do grfico em documentos do Word 2003. Aqui esto algumas tarefas que podem vie em seguida:
Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office: Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:. Alterar formatao, selecionando um estilo da caixa de combinao. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.
Criar um controle painel Aes para o painel Aes. Adicionar controles que so acoplados a dados a um controle painel Aes Windows Forms. Use uma Relao mestre / detalhes quando exibir dados nos controles. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto.
Visual C# Consolidado
1142
Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Acesso a um servidor com o exemplo de SQL Server do Northwind. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto
Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto
Criar um projeto Documento do Word com o nome My Word Actions Pane. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Actions Pane projeto para Solution Explorer o Visual Studio. Adicionar controles ao painel de aes
Para essa explicao passo a passo, necessrio um controle painel Aes que contm controles ligados a dados Windows Forms. Adicionar uma fonte de dados para o projeto, e arraste os controles a partir da Data Sources janela para o controle painel Aes. Para adicionar um controle painel Aes 4. 5. 6. Selecione o My Word Actions Pane projeto no Solution Explorer. No menu Project, selecione Add New Item. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la ActionsControl, e clique em Add Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu. Observao Se Show Data Sources Clique dentro do documento do Word e marque novamente. no estiver disponvel, 10. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. 11. Selecione Database e, em seguida clique em Next.
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
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
Para definir propriedades de vinculao de dados do controle 7. 8. 9. Selecione o CompanyNameComboBox controle. Na janela Properties, clique no boto para a direita da propriedade DataSource, e selecione SuppliersBindingSource. Na janela Properties, clique no boto para a direita da propriedade DisplayMember, e selecione CompanyName.
10. Selecione o ProductNameListBox controle. 11. Na janela Properties, clique no boto para a direita da propriedade DataSource, expanda SuppliersBindingSource, e selecione FK_Products_Suppliers. 12. Na janela Properties, clique no boto para a direita da propriedade DisplayMember, e selecione ProductName. Adicionando um mtodo para inserir dados em uma tabela Nesta etapa, ser ler os dados dos controles acoplados e preencher uma tabela em seu documento do Word. Primeiro, voc ir criar um procedimento para formatar os ttulos na tabela, e seguida, voc adicionar o AddData mtodo para criar e formatar uma tabela do Word. Para formatar os ttulos de tabela
Na classe ActionsControl, crie um mtodo para formatar os ttulos da tabela. Adicione cdigo conforme mostrado no exemplo a seguir: C#
static void SetHeadings(Microsoft.Office.Interop.Word.Cell tblCell, string text) { tblCell.Range.Text = text; tblCell.Range.Font.Bold = 1; tblCell.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; }
Visual C# Consolidado
1145
Na classe ActionsControl, escreva no um mtodo que criar uma tabela se um no existir, e adicionar dados a partir do painel Aes tabela. Adicione cdigo conforme mostrado no exemplo a seguir. C#
private void AddData(DataRow row, string companyName) { object missing = System.Type.Missing; // Create a table if it doesn't already exist. if (Globals.ThisDocument.Tables.Count == 0) { try { // Create a table. Microsoft.Office.Interop.Word.Table tbl = Globals.ThisDocument.Tables.Add (Globals.ThisDocument.Application.Selection.Range, 1, 4, ref missing, ref missing); // Insert headings. SetHeadings(tbl.Cell(1, 1), "Company Name"); SetHeadings(tbl.Cell(1, 2), "Product Name"); SetHeadings(tbl.Cell(1, 3), "Quantity"); SetHeadings(tbl.Cell(1, 4), "Unit Price"); } catch (Exception ex) { MessageBox.Show("Problem creating Products table: " + ex.Message, "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error); } } // Add data from data row to the table. Microsoft.Office.Interop.Word.Selection selection = Globals.ThisDocument.Application.Selection; if (selection.Tables.Count > 0) { Microsoft.Office.Interop.Word.Row newRow = Globals.ThisDocument.Tables[1].Rows.Add(ref missing); newRow.Range.Font.Bold = 0; newRow.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; newRow.Cells[4].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight; newRow.Cells[1].Range.Text = companyName; newRow.Cells[2].Range.Text = row["ProductName"].ToString(); newRow.Cells[3].Range.Text = row["QuantityPerUnit"].ToString(); newRow.Cells[4].Range.Text = Math.Round(Convert.ToDouble(row["UnitPrice"])).ToString("#,##0.00"); } else { MessageBox.Show("Cursor must be within a table.", "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Para inserir texto em uma tabela do Word 2. No manipulador Click de eventos do boto Insert, adicione cdigo conforme mostrado no exemplo o seguir: Observao Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
private void Insert_Click(object sender, System.EventArgs e) { DataTable tbl = northwindDataSet.Products; DataRow[] rows; // Check if a product is selected. if (this.productNameListBox.SelectedIndex >= 0) { DataRowView productRow =(System.Data.DataRowView)this.productNameListBox.SelectedItem; string product = productRow.Row["ProductName"].ToString(); string company = this.companyNameComboBox.Text; // Return the data row from the selected product. rows = tbl.Select("ProductName = '" + product.Replace("'", "''") + "'"); this.AddData(rows[0], company); } else { MessageBox.Show("Please select a product.", "Actions Pane", MessageBoxButtons.OK); } }
Visual C# Consolidado
1146
3.
Em C#, voc deve criar um manipulador de eventos para o Click Evento do boto. Voc pode colocar este cdigo no manipulador Load de eventos da classe ActionsControl. Para obter mais informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.Insert.Click += new EventHandler(Insert_Click);
Mostrando o Painel de Aes Voc nesta seo, vai escrever cdigo para mostrar o painel Aes. O painel Actions ficar visvel depois controles so adicionados a ele. Para mostrar o painel Aes 2. 3. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Criar uma nova instncia do controle na parte superior da classe ThisDocument de forma que ele tenha como no exemplo a seguir: C#
private ActionsControl actions = new ActionsControl();
4.
Adicione cdigo ao manipulador Startup de eventos de ThisDocument forma que ele tenha como no exemplo a seguir: Observao Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:.
C#
this.ActionsPane.Controls.Add(actions);
Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o painel Aes aberto quando o documento for aberto. Teste para a relao mestre / detalhes nos controles no painel Aes, e certifique-se que dados so preenchidos em uma tabela do Word quando o Insert boto clicado. Para testar seu documento 6. 7. 8. 9. Pressione F5 para executar o projeto. Confirme se o painel Actions est visvel. Selecione uma empresa na caixa de combinao e verifique que os itens na caixa Products Lista alterar. Selecione um produto, clique Insert no painel de aes, e verifique se os detalhes do produto foram adicionados tabela no Word. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de vinculao de dados a controles em um painel Aes no Word. Aqui esto algumas tarefas que podem vie em seguida:
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
Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Criando um novo projeto
Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto
Criar um projeto Documento do Word com o nome My Smart Tag, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
Abre o novo documento do Word no designer e adiciona o My Smart Tag projeto para Solution Explorer o Visual Studio. Configurando o projeto Para esta etapa, voc ir configurar o projeto para executar o cdigo fornecido nessa explicao passo a passo. Para configurar seu projeto 5. 6. 7. 8. No menu Project, clique em Add Reference. Na guia COM, selecione biblioteca tipo 2.0 marcas inteligentes Microsoft e clique em OK. No Solution Explorer, clique com o boto direito do mouse ThisDocument.vb (em Visual Basic) ou ThisDocument.cs (em C#) e clique em View Code. Adicione a seguinte linha de cdigo para o topo do arquivo:
Visual C# Consolidado
1148
C#
using System.Text.RegularExpressions;
Criando a marca inteligente Nesta etapa, voc ser criar uma Visual Studio Tools for Office marca inteligente e adicion-lo para o documento. Tambm ir adicionar uma expresso regular para a lista de termos que reconhece a marca inteligente, e criar uma ao que estar disponvel quando o usurio clica a marca inteligente. Para criar a marca inteligente 4. Substituir manipulador ThisDocument_Startup de eventos na classe ThisDocument pelo cdigo a seguir. Este cdigo cria uma SmartTag que representa a Visual Studio Tools for Office marca inteligente, e adiciona uma expresso regular para a lista de termos que reconhece a marca inteligente. C#
private Microsoft.Office.Tools.Word.Action action1; private void ThisDocument_Startup(object sender, System.EventArgs e) { Microsoft.Office.Tools.Word.SmartTag smartTag1 = new Microsoft.Office.Tools.Word.SmartTag( "www.microsoft.com/Demo#DemoSmartTag", "Demonstration Smart Tag"); smartTag1.Expressions.Add(new Regex( @"(?'number'[+-]?\b[09]+)?\s?(F|f)\b"));
5.
Criar uma nova Action e adicion-lo para a Actions propriedade da marca inteligente. A Action representa um item que o usurio pode clicar no menu de marcas inteligentes. C#
action1 = new Microsoft.Office.Tools.Word.Action( "Convert to Celsius"); smartTag1.Actions = new Microsoft.Office.Tools.Word.Action[] {action1};
6.
Do SmartTag anexar a marca inteligente para o documento, adicionando propriedade VSTOSmartTags. Na C#, anexar um manipulador de eventos para o Click evento da ao. C#
this.VstoSmartTags.Add(smartTag1); action1.Click += new Microsoft.Office.Tools.Word.ActionClickEventHandler( action1_Click); }
Criar um manipulador de eventos para a ao Nesta etapa, voc ir adicionar um manipulador de eventos para o Click evento da ao. O manipulador de eventos recupera o Fahrenheit valor de temperatura da chave number, que est no conjunto de propriedades da marca inteligente. O manipulador de eventos converte o Fahrenheit valor de temperatura para Celsius,. e substitui a seqncia reconhecido Neste exemplo, a chave number identifica um grupo capturado da expresso regular atribudo a marca inteligente. Para obter mais informaes sobre propriedade Sacos e expresses regulares em Visual Studio Tools for Office marcas inteligentes, consulte Arquitetura marcas inteligentes. Para criar o manipulador de eventos
Visual C# Consolidado
1149
Testar o aplicativo Agora voc pode testar seu documento para certificar-se que a marca inteligente converte Fahrenheit temperaturas para Celsius. Para testar sua pasta de trabalho 5. 6. Pressione F5 para executar o projeto. Digitar uma seqncia que esteja de acordo com a expresso regular adicionado marca inteligente, como 60F, 60 F,. ou 60 F Observao Para digitar um smbolo de grau (), pressione ALT e digite 248. 7. 8. Clique no cone de marca inteligente que aparece sobre a seqncia reconhecida e clique em Convert to Celsius. Confirme que a seqncia original substituda por uma nova seqncia contendo a temperatura em Celsius.
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
1150
Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo pressupe que voc estiver implantando uma soluo Word. Se voc quiser executar explicao passo a passo com uma soluo Excel, o substitua o nome do projeto do Word com o nome do seu projeto do Excel em todos os cdigos e exemplos XML.
Acesso a um servidor de rede para implantao. Essa explicao passo a passo pressupe que voc so redeploying sua soluo para o \\DeployServer\ShareFolder compartilhamento de rede. Privilgios de administrador no computador de desenvolvimento, para que voc possa definir a diretiva de segurana para um local de rede. Criando o projeto
Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto
Criar um projeto Documento do Word com o nome WordDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
Abre o novo documento do Word no designer e adiciona o WordDeployment projeto para Solution Explorer o Visual Studio. Adicionar cdigo para trs o documento Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos do documento. Isso permitir que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisDocument classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisDocument_Startup(object sender, System.EventArgs e) { MessageBox.Show("The document is deployed correctly."); }
8. 9.
Pressione F5 para executar o projeto. Inicia o Word e a caixa de mensagem aparece. Fechar a caixa de mensagem.
10. Sair do Word. Em seguida, voc publicar nesta soluo. Publicando a soluo
Visual C# Consolidado
1151
Nesta etapa, voc publicar a soluo em um local temporrio no computador local. Para publicar a soluo 6. 7. 8. 9. Clique com o boto direito do mouse o n de projeto no Solution Explorer. Clique Publish no menu de atalho. O Publish Wizard aparece. Na caixa Specify the location to publish this application, digite C:\TestDeploy. Clique em Finish. O documento de Soluo e manifesto de implantao so copiados para C:\TestDeploy. O conjunto de soluo, atualizado manifesto do aplicativo, e cpias do documento de Soluo e manifesto de implantao so copiadas para C:\TestDeploy\WordDeployment_1.0.0.0. Para obter mais informaes, consulte Implantando o Word e Excel Solutions. 10. Feche o WordDeployment projeto no Visual Studio. Observao O conjunto no tem permisso para executar ainda, para que ele se voc tentar executar a soluo ser lanar um erro. Voc ir atualizar sua diretiva de segurana para conceder permisso de confiana total ao conjunto em uma etapa posterior. Quando voc publicar uma soluo, o manifesto do aplicativo incorporado no aponta de documento de soluo para o caminho completo da manifesto de implantao. Se voc relanamento os arquivos de soluo para outro local, dever atualizar o manifesto do aplicativo incorporado para apontar para a nova localizao da manifesto de implantao. Voc tambm deve atualizar a manifesto de implantao e o manifesto do aplicativo externo para apontar para os novos locais de arquivo. Atualizando o manifesto Application incorporados Para editar o manifesto do aplicativo incorporado, use a ServerDocument classe que Visual Studio Tools for Office fornece. Quando voc usa a ServerDocument classe, voc deve executar o cdigo em um novo projeto (no a Visual Studio Tools for Office Soluo), como um projeto de console, e o Visual Studio Tools for Office documento de soluo deve ser fechado. Observao Inclui Visual Studio Tools for Office um exemplo que demonstre como criar uma ferramenta que pode ser usada para editar o manifesto do aplicativo incorporado. Para obter mais informaes, consulte Aplicativo Manifest exemplo Editor. Para atualizar o manifesto do aplicativo incorporado 6. 7. 8. Criar um novo projeto Console Application. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e System.Windows.Forms montagens para este projeto. Abra o arquivo Program.cs ou Module1.vb, e adicione a seguinte Imports ou using instruo para o topo do arquivo. C#
Visual C# Consolidado
1152
using Microsoft.VisualStudio.Tools.Applications.Runtime;
9.
Copie o cdigo a seguir para a Main funo. Este cdigo cria uma ServerDocument que fornece acesso ao manifesto do aplicativo incorporado de seu documento de soluo. O cdigo atribui o novo caminho manifesto de implantao para a DeployManifestPath propriedade, e salva e fecha o ServerDocument.. o ServerDocument C#
ServerDocument sd = null; try { sd = new ServerDocument(@"C:\TestDeploy\WordDeployment.doc"); sd.AppManifest.DeployManifestPath = @"\\DeployServer\ShareFolder\WordDeployment.application"; sd.Save(); } finally { if (sd != null) { sd.Close(); } }
10. Pressione F5 para executar o projeto. Uma janela do console aparece rapidamente enquanto o manifesto do aplicativo incorporado est sendo atualizado, e fecha a janela do console. Atualizando o manifesto de implantao Agora que voc atualizou o manifesto do aplicativo incorporado no documento Visual Studio Tools for Office de soluo, voc deve atualizar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Para atualizar a manifesto de implantao 4. Abra a manifesto de implantao em um editor de texto, como o Bloco de notas. A manifesto de implantao denominado WordDeployment.application, e est localizado na pasta C:\TestDeploy de publicao. Defina o codebase atributo do elemento <dependentAssembly> como o caminho completo da localizao implantao final do manifesto do aplicativo externos. Para obter mais informaes, consulte <dependentAssembly> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll.manifest"
5.
6.
Alm disso, para atualizar a manifesto de implantao, voc tambm deve editar o manifesto do aplicativo externo para apontar para os locais implantao final do conjunto de soluo e a manifesto de implantao. Sempre que voc publicar uma Visual Studio Tools for Office soluo, um novo manifesto do aplicativo externo gerado que aponta para a verso atual do conjunto de soluo. Para atualizar o manifesto do aplicativo externo 5. Abra o manifesto do aplicativo em um editor de texto, como o Bloco de notas. O manifesto do aplicativo denominado WordDeployment.dll.manifest, e est localizado na pasta C:\TestDeploy\WordDeployment_1.0.0.0 de publicao. Localize o <installFrom> elemento que est o filho do elemento <dependency>, e defina o codebase atributo como o caminho completo da montagem de soluo atual. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll"
6.
Visual C# Consolidado
1153
7.
Localize o <installFrom> elemento que est o filho do elemento <assembly>, e defina o codebase atributo para o caminho completo do manifesto de implantao. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\WordDeployment.application"
8.
Salve e feche o arquivo manifesto do aplicativo. Copiando os arquivos da soluo para o servidor
Agora que voc tiver editado os manifestos, voc est pronto para copiar os arquivos de soluo para o servidor. Para copiar os arquivos de soluo para o servidor 4. 5. 6. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder compartilhamento de arquivos de rede. Copiar o documento de Soluo e a manifesto de implantao para \\DeployServer\ShareFolder. Copiar o conjunto de soluo e o manifesto do aplicativo para \\DeployServer\ShareFolder\WordDeployment_1.0.0.0. Conceder confiana total para a pasta de rede Para execute sua Visual Studio Tools for Office soluo a partir da pasta de rede, voc deve conceder confiana total para a pasta de rede na sua diretiva de segurana no computador de desenvolvimento. Voc pode modificar a diretiva de segurana de um prompt de comando usando a ferramenta Diretiva de Segurana para Acesso ao Cdigo (Caspol.exe). Para conceder confiana para um local de rede, voc deve ter privilgios de administrador e voc dever alterar a diretiva de segurana no nvel do computador. Observao Este procedimento destinado a fim de executar essa explicao passo a passo. No use este procedimento para conceder confiana a conjuntos ou diretrios se no tiver certeza que sejam segura e protegida. Para obter mais informaes sobre concesso e remover permisses, consulte HOW TO: conceder permisses para pastas e montagens e Como remover permisses de pastas e montagens:. Para conceder confiana total para a pasta de rede
Testando a soluo Agora voc pode testar sua soluo para certificar-se que seu cdigo seja executado quando voc abre o documento a partir do computador de desenvolvimento. Para testar a implantao 3. 4. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no \\DeployServer\ShareFolder\. Confirme se a caixa de mensagem aparece.
Visual C# Consolidado
1154
Prximas etapas Voc tambm pode implantar a soluo usando um arquivo do Microsoft Windows Installer (.msi). Para obter mais informaes, consulte Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:.
Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo. Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.
Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:
Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com
Visual C# Consolidado
1155
uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues. Criando o projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome ExcelDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o ExcelDeployment projeto para Solution Explorer. Adicionar cdigo para trs a pasta de trabalho Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos da pasta de trabalho. Isso permite que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisWorkbook classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); }
8. 9.
Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem.
10. Saia do Excel. Em seguida, voc adicionar um projeto de instalao para sua soluo. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos. Para criar um projeto de instalao para a soluo 7. 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda Other Project types e selecione Setup and Deployment.
Visual C# Consolidado
1156
10. No painel Templates, selecione Setup project. 11. Nome do projeto ExcelSetup. 12. Clique em OK. O projeto instalao aparece no Solution Explorer. Por padro, o arquivo que voc ir criar usando este projeto instalao Windows Installer inclui uma caixa de dilogo que permite ao usurio final que especifique o local de instalao da soluo. Para obter mais informaes, consulte Caixa de dilogo interface do usurio da pasta de instalao. Adicionar o pasta de trabalho e assembly da soluo para o Project da instalao Nesta etapa, voc adicionar a sada do projeto ExcelDeployment principal para o projeto de instalao. A sada do projeto ExcelDeployment principal consiste de pasta de trabalho e o conjunto de soluo. Para adicionar o documento e conjunto ao projeto de instalao 10. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 11. Selecione View no menu de atalho, e depois clique em File System. 12. Clique com o boto direito do mouse Application Folder no painel esquerdo. 13. Aponte para Add no menu de atalho, e clique em Project Output. 14. Selecione ExcelDeployment na caixa Project. 15. Selecione Primary output na lista de tipos de sada. 16. Clique em OK. A sada do projeto e dependncias aparecem no painel direito. 17. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n de projeto. 18. Clique com boto direito mouse cada dependncia, exceto para Microsoft .NET Framework, e clique Exclude no menu de atalho. Criar um projeto de ao personalizada Nesta etapa, voc ir criar um projeto que contm aes personalizadas para o projeto de instalao. Aes personalizadas so um recurso do Windows Installer que permitem a voc para executar cdigo no final de uma instalao para executar aes que no podem ser executadas durante a instalao. Para obter mais informaes, consulte Aes Personalizadas. Para criar um projeto ao personalizada 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. 10. No painel Project types, expanda o n para a linguagem de programao, e selecione Windows. 11. No painel Templates, selecione Class Library. 12. Nome do projeto ExcelCustomAction. 13. Clique em OK. O novo projeto aparece na Solution Explorer.
Visual C# Consolidado
1157
14. No Solution Explorer, clique com o boto direito do mouse Class1.vb ou Class1.cs sob o ExcelCustomAction projeto e, em seguida, clique em Delete. Este arquivo desnecessrio para essa explicao passo a passo. Criar uma ao personalizada que salvas o manifesto de aplicativo Quando voc executava seu projeto anteriormente nessa explicao passo a passo pelo pressionamento F5, a processo de criao editado o manifesto do aplicativo incorporado na pasta de trabalho para aponte para o caminho relativo do conjunto. Se a pasta de trabalho e o conjunto permanecer na mesma pasta aps a instalao, ento voc no precisam modificar o manifesto do aplicativo incorporado, e voc pode ignorar esta seo. No entanto, se voc quiser que o usurio possa mover a pasta de trabalho para uma pasta diferente aps a instalao, voc deve editar o manifesto do aplicativo para apontar para o caminho completo da montagem. Voc deve atualizar o manifesto do aplicativo que est incorporado no Visual Studio Tools for Office documento de Soluo ao executar uma ao personalizada aps a instalao, porque o local do conjunto de soluo desconhecido at que o usurio especifica o local durante a instalao. Editar o manifesto do aplicativo incorporado, usando a ServerDocument classe. Para usar a ServerDocument classe no projeto de instalao, adicione cdigo para uma Installer classe dentro do projeto ao personalizada. Para criar uma ao personalizada que edita o manifesto do aplicativo 9. Clique com o ExcelCustomAction projeto no Solution Explorer. A Add New Item caixa de dilogo ser exibida. 11. Selecionar Installer Class, e nome da classe ManifestEditor. 12. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime para o ExcelCustomAction projeto. 13. Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer, ou ManifestEditor.vb arquivo e clique em View Code. 14. Adicione a instruo seguinte Imports ou using para o topo do arquivo de cdigo. C#
using Microsoft.VisualStudio.Tools.Applications.Runtime;
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
16. Clique com o ExcelCustomAction projeto no Solution Explorer, e, em seguida clique em Build. Adicionando a ao personalizada ao projeto de instalao Nesta etapa, voc adicionar a sada do projeto ExcelCustomAction principal para o projeto de instalao. Isso permite que o arquivo Windows Installer para executar a ao personalizada que edita o manifesto do aplicativo. Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao 12. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 13. Aponte para View no menu de atalho, e clique em Custom Actions. 14. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add Custom Action. 15. Na caixa Look In Selecionar Application Folder, e clique em Add Output 16. Selecione ExcelCustomAction na caixa Project. 17. Selecione Primary output na lista de tipos de sada, e depois clique em OK. 18. Verifique que Primary output from ExcelCustomAction (Active) foi adicionado lista de sadas primria para o projeto de instalao e clique em OK 19. Em expandir Install. o Custom Actions Editor, 20. Clique com o boto direito do mouse Primary output from ExcelCustomAction (Active) e, em seguida clique em Properties Window. 21. Na janela Properties, defina a CustomActionData propriedade para a seguinte seqncia:
/targetdir="[TARGETDIR]/" /documentname="ExcelDeployment.xls" /assemblyname="ExcelDeployment.dll"
Para obter informaes sobre a CustomActionData propriedade, consulte Propriedade CustomActionData. 22. Clique com o boto direito do mouse e, em seguida clique em Build. Em Solution Explorer, o ExcelSetup project Teste a instalao Agora voc pode testar a soluo para garantir que sua soluo instalada quando voc executar o arquivo do Windows Installer no seu computador de desenvolvimento. Para testar a instalao 5. 6. 7. 8. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution Explorer, o ExcelSetup project Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no seu computador de desenvolvimento. Abrir a pasta de trabalho do Excel a partir da pasta de instalao. Confirme se a caixa de mensagem aparece.
Visual C# Consolidado
1159
Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos
Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto
Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto
Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.
O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha. Para adicionar uma caixa de mensagem a um evento de inicializao 12. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. 13. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho 14. Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#
private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); }
15. No menu File, clique em Save All. 16. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. 17. Clique em Save. 18. Pressione F5 para executar o projeto.
Visual C# Consolidado
1160
O Excel iniciado e aparecer a caixa de mensagem. 19. Fechar a caixa de mensagem. 20. Feche o Excel. 21. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 22. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado. Para remover um grupo de cdigos 9. No Painel de Controle, abra Administrative Tools. 10. Executar Microsoft .NET Framework 2.0 Configuration. 11. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 12. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho. Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 13. Clique em Yes. 14. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 15. Clique em OK. 16. Feche o Excel. O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.
Visual C# Consolidado
1161
Para criar um nome forte 9. No menu Project no Visual Studio, clique em My Security Test Properties. 10. Clique na Signing guia. 11. Selecione Sign the assembly. 12. No, o Choose a strong name key file list clique New. 13. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. 14. Desmarque a Protect my key file with a password caixa de seleo. 15. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. 16. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte. Para conceder confiana com base em nome forte 10. Abra Microsoft .NET Framework 2.0 Configuration novamente. 11. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho 12. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. 13. Na lista Choose the condition type for this code group, clique Strong Name. 14. Clique em Import. 15. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open. 16. Clique em Next. 17. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. 18. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta. Para testar sua pasta de trabalho 3. 4. Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.
Visual C# Consolidado
1162
Microsoft Office Word 2003 documentos em tempo de criao ou em tempo de execuo. Por exemplo, voc pode adicionar um ComboBox controle a sua planilha para que os usurios possa selecionar em uma lista de opes. Voc tambm pode adicionar controles host, como controles Bookmark e NamedRange controles, para documentos do Office. Para obter mais informaes, consulte Controles host do Word e Controles host do Excel. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Adicionando controles em tempo de design Para arrastar um Windows Forms controle para o documento 3. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da Clique no controle que voc deseja adicionar e arraste-o para o documento. o Toolbox, Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Para desenhar um Windows Forms controle sobre o documento 4. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls da caixa de ferramentas, clique no controle voc deseja adicionar. No documento, clique no local em que a extremidade superior esquerda do controle para ser localizado, e arraste para onde voc deseja o canto inferior-direito do controle seja localizado. O controle adicionado para o documento com o local especificado e tamanho. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.
4.
5. 6.
Visual C# Consolidado
1163
Para adicionar um controle Windows Forms para o documento clicando uma nica vez sobre o controle 4. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da clique Toolbox, o controle voc deseja adicionar Um documento, clique onde desejar o controle a ser adicionado. O controle adicionado ao documento com o tamanho padro. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Para adicionar um controle Windows Forms para o documento clicando duas vezes no controle 3. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Controle voc deseja para adicionar de clique duplo no Toolbox. O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Para adicionar um controle Windows Forms para o documento, pressionando a tecla ENTER 3. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da Clique no controle que voc deseja adicionar e pressione a tecla ENTER. o Toolbox, O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.
5. 6.
4.
4.
Visual C# Consolidado
1164
Voc tambm pode adicionar controles Windows Forms dinamicamente a um documento em tempo de execuo usando os mtodos auxiliar fornecidos pelo Microsoft Visual Studio 2005 Tools for the Microsoft Office System. No exemplo abaixo, clula A1 de um projeto de aplicativo Excel. adicionado um Button Para obter informaes sobre como adicionar outros controles Windows Forms, consulte Adicionar controles a documentos do Office em tempo de execuo. Adicionando controles em tempo de execuo Para adicionar um Windows Forms controlar programaticamente
No manipulador Startup de eventos de ThisWorkbook, insira o cdigo a seguir para adicionar clula C5: um Button C#
private void Sheet1_Startup(object sender, System.EventArgs e) { Microsoft.Office.Tools.Excel.Controls.Button salesButton; salesButton = this.Controls.AddButton(this.get_Range("C5", missing), "salesButton"); salesButton.Text = "Calculate Total Sales"; }
4.
Executar clculos para o aplicativo inteiro Para executar clculos em todas as pastas de trabalho abertas
Compilando o cdigo
Este cdigo deve ser colocado em uma classe folha, no na classe ThisWorkbook.
Visual C# Consolidado
1165
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."; }
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#.
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.
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
CAB Gerao de arquivo usando projetos Visual Studio instalao e implantao. Esse processo elimina a necessidade de personalizar o arquivo.inf manualmente. Filtrar sem suporte propriedades / Methods / eventos.
Recurso inclui IntelliSense filtrado, uma etapa de verificao de criao, e capacidade para converter controles sem suporte. Cores em que aparecem no dispositivo. Definir caixa de dilogo de cor (dispositivos)
Editor de cores
Suporte completo. Use Criar e exibir classes e tipos Para adicionar atributos personalizados de designer. HOW TO: Dock controles em Windows Forms
Visual C# Consolidado
1170
Dados em projetos de dispositivos gerenciados Fontes como suporte para a plataforma atual. Caixa de dilogo Editor fonte (dispositivos) Caixa de dilogo de propriedades fator (Dispositivos) de formulrio
Editor fonte
Formulrio suporte fator, incluindo orientao e resoluo. *Autoscale Capa formulrio com a criao de cdigo
Caixa de dilogo de propriedades fator (Dispositivos) de formulrio WebBrowser, Notification, DocumentList, DateTimePicker, MonthCalendar, LinkLabel, Splitter, BindingSource Designers aprimorados fornecem precisa aparncia para cada plataforma. Suporte Smartphone 2003 e Pocket PC 2003
Alterar plataformas usando o mesmo cdigo de fonte Como Compartilhar Cdigo Fonte Atravs de Plataformas (Dispositivos) Consulte tambm Referncia
Visual C# Consolidado
1171
3.
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).
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.
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.
Visual C# Consolidado
1174
Para Exibir e gerenciar o sistema de arquivos em um dispositivo de destino (incluindo exportar e importar) Exibir informaes sobre identificadores da pilha e sinalizadores para cada processo em execuo em um dispositivo de destino Exibir informaes sobre cada processo em execuo em um dispositivo de destino Exibir e gerenciar o Registro para um dispositivo de destino
Uso Visualizador de arquivos remoto Dependency Walker da pilha remoto Visualizar do processo remoto Editor do Registro remoto Spy remoto
Exibir mensagens recebidas pelo janelas associadas aplicativos executados em um dispositivo de destino Capturar uma imagem tela em formato bitmap (.bmp) de um dispositivo de destino Consulte tambm
In Zoom-remoto
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.
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.
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.
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
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.
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.
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.
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
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.
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.
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.
Visual C# Consolidado
1184
Configuraes do Visual Studio. Para criar e executar a verso Pocket PC 1. 2. 3. 4. 5. 6. 7. 8. No menu visual studio File, aponte para New, e clique em Project. Expanda Visual Basic no painel Project types,, e Smart Device Clique em Pocket PC 2003. No painel Templates, clique em Device Application (1.0), e clique em OK O acrescentadas (1.0) indica que este um projeto .NET Compact Framework verso 1.0. No designer, clique com o boto direito do mouse no formulrio e no menu de atalho, clique em Properties Desmarque o Text valor da propriedade do formulrio ou seja, facilitam em branco. No Solution Explorer, clique com o boto direito do mouse Form1.vb e depois no menu de atalho, clique em View Code. Expanda a Windows Form Designer generate code regio. Aps InitializeComponent() em pblica New() Sub, insira o cdigo a seguir:
#If PocketPC Then Me.Text = "PPC2003" #Else Me.Text = "Smartphone" #Endif
9.
10. Na caixa Deploy <Projectname> de dilogo, clique em Pocket PC 2003 SE Emulator, e clique em Deploy O aplicativo Pocket PC executado no emulador com PPC2003 na barra de ttulo do formulrio. Para criar e executar a verso Smartphone 1. 2. 3. 4. Feche o emulador sem salvar estado. Se uma mensagem for exibida indicando que a conexo foi perdida, clique em OK. No menu Project, clique em Change Target Platform. Na caixa Change to Na caixa Change Target Platform de dilogo, selecione Smartphone2003, e depois clique em OK. Na mensagem caixa avisando que o projeto ser fechado e reaberto, clique em Yes. Observe que a caixa Dispositivos de destino na barra de ferramentas agora exibe Smartphone 2003 SE Emulator. 5. 6. No menu Debug, clique em Start Debugging. Na caixa Deploy <Projectname> de dilogo, clique em Smartphone 2003 SE Emulator, e clique em Deploy O aplicativo Smartphone executado no emulador com Smartphone na barra de ttulo do formulrio.
Visual C# Consolidado
1185
1. 2.
No menu Project, clique em Change Target Platform. Na caixa Change to, selecione uma plataforma diferente, e clique em OK Somente as plataformas disponveis so aquelas que destino a mesma verso do .NET Compact Framework como o projeto ativo.
Visual C# Consolidado
1186
1. 2. 1. 2.
No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no menu de atalho, clique em Properties. Na guia Compile, selecione Treat all warnings as errors. No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no menu de atalho, clique em Properties. Na guia Build, selecione All na seo Treat warnings as errors.
Na guia Device Components da Toolbox, arraste um HardwareButton componente em um formulrio do Windows ou na bandeja componente no designer. Na Bandeja de componente, clique com o boto direito do mouse no HardwareButton controle e no menu de atalho, clique em Properties Defina a AssociatedControl propriedade para o formulrio, por exemplo, Form1. Defina a HardwareKey propriedade para a chave voc deseja substituir, por exemplo, ApplicationKey1. Clique no boto, por exemplo, Soft Key 1. na capa do designer O editor de cdigo abre no manipulador Form_KeyDown de eventos. Insira o cdigo a seguir:
if ((int) e.KeyCode == (int) Microsoft.WindowsCE.Forms.HardwareKeys.ApplicationKey1) { //TODO
Visual C# Consolidado
1187
5.
Clique com boto direito no designer, mouse o formulrio ou a capa, e seguida, selecione Rotate Left ou Rotate Right para girar a capa. Se o formulrio gira quando o dispositivo gira depende na plataforma atual e das definies de propriedade de formulrio, da seguinte maneira:
o o
Smartphone: O formulrio sempre gira quando gira o dispositivo. Pocket PC: O formulrio gira por padro quando o dispositivo gira. Para impedir que o formulrio de girar com o dispositivo, defina a WindowState propriedade do formulrio para Normal e a FormBorderStyle propriedade None. O formulrio Windows CE: No no girar por padro quando o dispositivo gira. Para tornar o formulrio giram com o dispositivo, defina a WindowState propriedade como Maximized. Clique Options no menu Tools, e Device Tools Clique em Form Factors. Selecione o fator de formulrio por exemplo, Pocket PC 2003 Portrait para o formulrio no projeto, e depois clique em Properties. Na caixa Form Factor Properties de dilogo, definir a resoluo vertical e horizontal. Clique OK para fechar a Form Factor Properties caixa de dilogo e clique OK novamente para fechar a Options caixa de dilogo. Observao Se o designer foi aberto quando voc alterou opes, feche e reabri-la para as alteraes sejam efetivadas.
Visual C# Consolidado
1188
Clique em Pocket Guia do Desenvolvedor PC. Se o tpico exibido, a seo Mobile and Embedded Development est instalada. Se o tpico no for encontrado, voc pode adicionar a seo Mobile and Embedded Development, seguindo as etapas abaixo.
Para incluir tpicos Mobile e Embedded Development 1. 2. 3. 4. 5. 6. 7. 8. No Painel de controle, Windows clique em Add or Remove Programs. Selecionar MSDN Library for Visual Studio 2005, e, em seguida clique em Change. Na pgina Welcome da clique Setup WizardNext,. Na pgina Program Maintenance, clique em Modify. Na pgina Custom Setup, selecione Mobile and Embedded Development. No menu de atalho disponvel a partir do boto drop-down, selecione This feature, and all subfeatures, will be installed on local hard drive. Clique em Next. Na pgina Ready to Modify the Program, clique em Install.
Filtragem tpicos da Ajuda Fornece Visual Studio um filtro inteligente Development dispositivo para o ndice de Contedo e ndice. Quando voc aplica esse filtro, os tpicos visveis so reduzidos para incluir apenas documentao considerada bsica para os desenvolvedores de dispositivo inteligente. Mais importante, aplicar este filtro uma maneira excelente para exibir somente os subconjuntos de dispositivo inteligente de tpicos de referncia em tempo de execuo, incluindo .NET Compact Framework e as bibliotecas da MFC e ATL. Se voc aplicar um filtro de idioma (por exemplo, C Visual) #, tpicos de desenvolvimento de dispositivo inteligente so excludos dos tpicos visveis. Por esse motivo melhor para usar o filtro inteligente Development dispositivo ou nenhum filtro em todos os. Observe tambm que um filtro de idioma atribudo pelo padro caso voc tenha efetuado logon para Visual Studio usar uma configurao de desenvolvimento de idioma, como configuraes Development Visual C#.
Como se Conectar ao Emulador de Dispositivo a partir de uma Sesso de PC Virtual Visual C# Consolidado 1189
Voc no pode usar TCP / IP para conectar ao emulador de dispositivo durante uma sesso virtual PC (VPC) porque VPC no oferece suporte o driver virtual chave de rede. O emulador precisa esse driver para uma conexo TCP / IP. Em vez disso, use as etapas a seguir. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para conectar-se para o emulador durante uma sesso Virtual PC 1. 2. 3. 4. 5. 6. 7. Instalar 4.x Microsoft ActiveSync na imagem Virtual PC. No menu do ActiveSync File, clique em Connection Settings. Na caixa Connection Settings de dilogo, altere o transporte de conexo para DMA. Inicie o emulador. No menu visual studio Tools, clique em Device Emulator Manager. Na caixa Available Emulators, clique com o boto direito do mouse o emulador desejado, e clique Cradle no menu de atalho Siga as instrues no Assistente do ActiveSync para estabelecer uma parceria.
Visual C# Consolidado
1190
7. 8.
Marque a Allow connections to one of the following caixa de seleo. Selecione DMA a partir da lista de portas, e depois clique em OK. O ActiveSync agora inicia uma parceria com o emulador. Siga as instrues fornecidas pelo New Partnership Wizard. Observao Se uma parceria no iniciada automaticamente, clique Connect na caixa Connection Settings de dilogo, e siga os prompts no Get Connected Wizard.
9.
Depois voc concluiu as etapas de parceria ActiveSync, clique em Explore Barra de Ferramentas ActiveSync para acessar o sistema de arquivos do emulador Smartphone no. Observao Sempre que desejar para usar um emulador conectado com Visual Studio usando o ActiveSync, usar o dispositivo, emulador, destino da plataforma correspondente no.
Visual C# Consolidado
1191
5.
No menu do ActiveSync, toque Connect via Bluetooth. Agora voc deve ter uma conexo do ActiveSync.
o o o o o
2. 3. 1.
Visual C# Consolidado
1192
2. 3. 4. 5.
Selecionar Windows CE Device, e, em seguida clique em Properties. Para direita caixa Transport, clique em Configure. Na caixa Configure TCP/IP Transport de dilogo, selecionar Use specific IP address, e digite o endereo IP do dispositivo. Feche as caixas de dilogo. Uma caixa de mensagem pode exibida solicitando que voc para redefinir o dispositivo. Nesse caso, uma redefinio de disco suficiente.
Para definir a segurana e estabelecer a conexo 1. 2. No prompt de comando no dispositivo, execute cMaccept.exe. Se em trs minutos, conectar o dispositivo. Se voc estabelecer a sua primeira conexo em trs minutos, voc pode continuar implantao e depurao indefinidamente, desde que voc estiver usando a mesma Visual Studio instncia. Se voc precisa se conectar de outra instncia do Visual Studio, voc precisar executar essas etapas de segurana novamente. Observao de segurana Voc pode eliminar a etapa cMaccept, desativando a segurana no dispositivo. Do Editor do Registro remoto para fazer isso, use para definir HLKM\CoreConOverrideSecurity = 1. Desativar segurana expe seu dispositivo para ataques mal-intencionados e no recomendado a menos que voc tiver fornecido protees apropriadas.
Visual C# Consolidado
1193
1.
No menu Windows Start, aponte para All Programs, aponte para Microsoft Visual Studio 2005, em seguida, aponte para Visual Studio Remote Tools, e clique em Remote File Viewer. No Select a Windows CE Device, selecione o emulador Smartphone, e, em seguida, clique OK para abrir a Windows CE Remote File Viewer janela. A Storage Card entrada a pasta compartilhada.
2.
Visual C# Consolidado
1194
No h suporte atualmente para usando as instncias de depurao dois ao mesmo tempo no mesmo processo. Atributo-Based depurao sem suporte O.NET Compact Framework no oferece suporte baseado no atributo-depurao. A capacidade de definir atributos para visualizadores e assim por diante, portanto, no est disponvel para usurios dos depuradores do dispositivo. rea de trabalho Depurao No com suporte Voc no pode usar os depuradores do dispositivo para depurar aplicativos escritos para rea de trabalho. Use os depuradores de mesa. Ncleo depurao sem suporte Voc no pode usar os depuradores do dispositivo para depurao do ncleo. Apenas meus depurao no aceita do cdigo No possvel usar apenas cdigo meu depurao. Adies depurador Runtime (Cordbg.exe) O depurador Runtime ajuda fornecedores ferramentas e desenvolvedores localizar e corrigir erros em programas que destino o Common Language Runtime (CLR).Net Framework. Projetos de dispositivo adicionar um novo comando e um novo argumento de modo ao depurador Runtime. A sintaxe para o novo comando e argumento de modo (dentro uma sesso Cordbg.exe) descrita na tabela abaixo. Para obter mais informaes e sintaxe completa, consulte Depurador Runtime (Cordbg.exe). Comando [mode Descrio EmbeddedCLR um argumento de modo que define o depurador como projetos de dispositivo de destino. Para controlar essa configurao, especifique 1 para on ou 0 para off. Conecta a um dispositivo CLR incorporado remoto. Parmetros: Machine_name Necessrio. O nome ou endereo IP do computador remoto. Port Necessrio. A porta para usar para conectar-se para o computador remoto. Problemas de Conexo Desativando o dispositivo enquanto o depurador est sendo executado faz o depurador para fechar por causa da falha de conexo. A falha de conexo ocorre porque o aplicativo ainda est sendo executado em segundo plano para o dispositivo. O boto X no Pocket PC um recurso
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.
No menu Debug, clique em Start. Observao Anexe se voc desconectar-se de processos iniciados no menu Debug, voc no pode novamente sem executar as seguintes etapas para anexar aps um processo est sendo executado. Isto , a chave do Registro para o dispositivo a ser definido.
Visual C# Consolidado
1196
Anexar a um j est em execuo Managed processo Se voc planeja fazer anexar a um processo que j est executando, por, por exemplo, clicando Start Without Debugging e ento anexar a processo gerenciado em execuo, precisar primeiro definir a chave registro dispositivo antes do incio do processo e voc tentar se conectar usando a Attach to Process caixa de dilogo antes. As seguintes etapas detalham o processo.
Para definir a chave do Registro do dispositivo para ativar anexar a um processo em execuo
1. 2. 3. 4. 5. No menu Windows Start, aponte para All Programs, aponte para Microsoft Visual Studio 2005, aponte para Visual Studio Tools, e clique em Remote Registry Editor. Usando o Editor do Registro remoto, se conectar o dispositivo. Para navegar ou crie a seguinte chave: depurador HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ .NETCompactFramework\Managed Definir ou crie um valor DWORD nomeado AttachEnabled. Definir os dados para o valor em 1. Observao Definio da chave de depurao do dispositivo significativamente reduz o desempenho. Quando voc no est depurando, desativar gerenciado anexar, redefinindo o valor de dados para 0 ou excluir o AttachEnabled valor. 6. Feche o Editor do Registro remoto. Gerenciado anexar. e voc podero para iniciar um processo sem o depurador e, em seguida, anexar ao processo usando a Attach to Process caixa de dilogo est ativado,
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
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.
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.
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.
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.
3.
O indicador ponto de interrupo mostra que a execuo parou no ponto de interrupo. 3. No menu Debug, clique em Step into OU pressione F11. Observe que a execuo movido para a linha seguinte. Isso mostra que voc pode percorrer a parte da sua soluo nativa agora. Anexando com o depurador gerenciado A prxima etapa para desanexar o depurador nativo para que voc pode anexar com o depurador gerenciado. Lembre-se que ambos os depuradores no podem ser anexados ao mesmo tempo para projetos de dispositivo. Essas so as etapas voc usaria qualquer tempo necessrio para alternar do nativo para o depurador gerenciado.
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.
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
Visual C# Consolidado
1203
1. 2. 3. 1. 2. 3. 1. 2. 3.
No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de dados e clique Properties no menu de atalho Definir o Custom Tool valor como MSResultSetGenerator. Recrie a soluo. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de dados e clique Properties no menu de atalho Definir o Custom Tool valor como MSDataSetGenerator. Esse valor o valor padro. Recrie a soluo. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de dados e clique Properties no menu de atalho Definir o Custom Tool valor como MSDataSetResultSetGenerator. Recrie a soluo.
Visual C# Consolidado
1204
Para alterar a seqncia de conexo em tempo de execuo 1. 2. 3. No Solution Explorer, selecione o arquivo.xsd. No menu View, clique em Properties Window. Digitar uma seqncia de conexo em tempo de execuo para a Connection String propriedade.
Visual C# Consolidado
1205
3. 4. 5.
Alterar a Text propriedade do boto para Save. Clique duas vezes no boto no formulrio para abrir o Editor de Cdigo no boto clique manipulador de eventos. Digite o seguinte cdigo:
this.customersBindingSource.EndEdit(); this.customersTableAdapter.Update(this.northwindDataSet. Customers);
Visual C# Consolidado
1206
Observao de segurana Para projetos que sero usados em aplicativos do mundo real, escolha uma senha de alta segurana. 5. Na caixa Add Connection de dilogo, clique Test Connection para garantir que a conexo foi feita. Uma mensagem aparece, indicando que a conexo de teste xito. Observao SQL Server Mobile no oferece suporte abrir arquivos de banco de dados em um compartilhamento de rede. 6. 7. Clique OK para retornar para a Add Connection caixa de dilogo e clique OK para fechlo. Na pgina Choose Your Data Connection, selecione Yes, include sensitive data in the connection string. Observao de segurana Para projetos que sero usados em aplicativos do mundo real, voc deve escolher a exclude dados confidenciais da seqncia de conexo. No mnimo, voc deve garantir que os dados confidenciais so criptografados. 8. Clique em Next. Ser a Local database file caixa de mensagem exibida inquiring se voc deseja incluir o arquivo de dados no projeto atual. Clique em Yes. 9. Na pgina Choose Your Database Objects, selecione as tabelas ou outros objetos que deseja incluir no seu projeto. Agora voc pode exibir o novo banco de dados como um DataSet na janela Data Sources clicando Show Data Sources no Data menu. Para adicionar tabelas, colunas, restries, e assim por diante para o banco de dados, consulte Gerenciar fontes de dados em projetos de dispositivo.
Visual C# Consolidado
1207
Esta conexo deve ser exibida na caixa suspensa se seu banco de dados j estiver disponvel em Server Explorer. Se a conexo de banco de dados no aparecer na lista, clique New Connection para abrir a Add Connection caixa de dilogo, clique Browse para abrir a Select SQL Server Mobile Edition Database File caixa de dilogo, navegue para seu banco de dados, e, em seguida clique em Open. Em seguida clique OK para fechar a Add Connection caixa de dilogo. 4. Na pgina Choose Your Data Connection, clique em Next. Ser a Local database file caixa de mensagem exibida inquiring se voc deseja incluir o arquivo de dados no projeto atual. Clique em Yes. 5. 6. Na pgina Choose Your Database Objects, selecione os objetos que deseja usar como fontes dados em seu projeto. Clique em Finish. Objetos que voc selecionou no SQL Server Mobile Database so exibidos como fontes de dados para o projeto na janela Data Sources. Para abrir a janela, clique Show Data Sources no Data menu.
Como: Adicionar um banco de dados do SQL Server como uma fonte de dados (Dispositivos)
Voc pode usar bancos de dados do SQL Server como fontes de dados em seu projetos dispositivo gerenciado. Para adicionar uma conexo de dados SQL Server ao Explorer Server 1. 2. 3. 4. 5. 6. No menu View, clique em Server Explorer. Na janela Explorer Server, clique com o boto direito do mouse Data Connections e clique Add Connection no menu de atalho. Na caixa Add Connection de dilogo, clique em Change. Na caixa Change Data Source de dilogo, selecionar Microsoft SQL Server, e clique em OK Para reabrir a Add Connection caixa dilogo Na caixa Server name, especifique o nome do servidor onde a fonte de dados est localizada. Faa logon no servidor. Se o servidor usa a autenticao do SQL Server, voc precisar fornecer um nome de usurio e senha. 7. Na caixa Select or enter a database name, selecione ou digite o nome do banco de dados, e, em seguida, clique em OK. A nova conexo de dados exibida no Server Explorer. Para usar uma conexo de dados SQL Server como fonte de dados em um projeto 1. 2. 3. 4. 5. Pr-requisito: Voc deve ter um Projeto de Dispositivo Inteligente .NET Compact Framework j abrir no IDE Visual Studio. No menu Data, clique em Add New Data Source Para abrir o Data Source Configuration Wizard. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next Na pgina Choose Your Data Connection, clique em New Connection. Na caixa Add Connection de dilogo, clique em Change.
Visual C# Consolidado
1208
6. 7. 8.
Na caixa Change Data Source de dilogo, selecionar Microsoft SQL Server, e clique em OK Para reabrir a Add Connection caixa dilogo Na caixa Server name, digite ou selecione o nome do servidor onde a fonte de dados est localizada. Faa logon no servidor. Se o servidor usa a autenticao do SQL Server, voc precisar fornecer um nome de usurio e senha.
9.
Na caixa Select or enter a database name, selecione ou digite o nome do banco de dados, e, em seguida, clique em OK.
10. Na pgina Choose Your Data Connection, optar por excluir dados confidenciais da seqncia de conexo, e clique em Next. Observao de segurana Incluindo dados confidenciais na seqncia de conexo representa um risco de segurana. 11. Na pgina Choose Your Database Objects, selecione os objetos voc deseja usar como fontes de dados, e clique em Finish. A conexo de dados agora aparece como uma fonte de dados na Data Sources janela.
Visual C# Consolidado
1209
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.
Visual C# Consolidado
1210
3. 4.
Clique com boto direito em Tables, mouse a tabela voc deseja excluir e, em seguida, no menu de atalho, clique em Drop Table. Na caixa Delete Objects de dilogo, clique em Remove, e clique em OK Observao No possvel remover uma tabela at que todas as referncias para a tabela sejam excludas.
Como Gerenciar ndices em um Banco de Dados SQL Server Mobile (Dispositivos) Visual C# Consolidado 1211
As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Server Explorer. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Para criar um ndice para um banco de dados do SQL Server Mobile 1. 2. 3. 4. 5. 6. 7. 1. 2. 3. 4. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a fonte de dados no qual voc deseja criar um novo ndice. Expandir a tabela para o qual voc deseja o novo ndice, e em seguida, clique com o boto direito do mouse a Indexes pasta. No menu de atalho, clique em Create Index. Na caixa New Index de dilogo, digite um nome para o ndice, e clique em Add. Na caixa Select Columns from <Table> de dilogo, selecione as colunas a serem adicionados chave de ndice, e clique em OK. Clique OK para fechar a New Index caixa de dilogo. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a Conexo de Dados e Tabela que contm o ndice cujas propriedades voc deseja editar. Clique com o boto direito do mouse o ndice, e, em seguida clique Index Properties no menu de atalho. Voc pode alterar a ordem de classificao na caixa de dilogo No possvel alterar outras propriedades do ndice exceto, substituindo o ndice existente por um novo nome. Para descartar um ndice de um banco de dados do SQL Server Mobile 1. 2. 3. 4. 5. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo de dados do qual voc deseja descartar um ndice. Expandir tabela que possui o ndice, expandir Indexes, e em seguida, clique com o boto direito do mouse o ndice para ser descartado. No menu de atalho, clique em Drop Index. Na caixa Delete Objects de dilogo, clique em Remove, e clique em OK
Como Gerenciar Senhas para um Banco de Dados SQL Server Mobile (Dispositivos)
Voc pode definir uma senha quando voc cria um banco de dados do SQL Server Mobile, e voc pode alterar a senha em um banco de dados existente. Observao de segurana Incluindo uma senha em uma seqncia de conexo representa um risco de segurana. Para obter mais informaes, consulte Securing Databases (SQL Server Mobile Edition). As etapas de exemplo a seguir presumem voc tiver um aplicativo Windows Forms Pocket PC abrir.
Visual C# Consolidado
1212
Para definir uma senha ao criar um banco de dados SQL Server Mobile 1. 2. 3. 4. 5. 6. 7. 8. No menu Data, clique em Add New Data Source. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next Na pgina Choose Your Data Connection, clique New Connection para abrir a Add Connection caixa de dilogo. Clique em Change, selecione Microsoft SQL Server Mobile Edition, e clique em OK. Na caixa Add Connection de dilogo, selecione My Computer. Clique em Create. Na caixa Create New SQL Server 2005 Mobile Edition Database de dilogo, digite um caminho qualificado fullly-para o novo banco de dados (por exemplo, c:\MyDatabase.sdf). Do New Password em e Confirm Password caixas, digite uma senha para o novo banco de dados, e clique em OK. No menu View, clique em Server Explorer. Na Server Explorer janela, clique com boto direito a fonte de dados para que voc deseja alterar a senha. No menu de atalho, clique em Database Properties. Na caixa Database Properties de dilogo, clique em Set password. Digite as senhas antiga e nova na conforme solicitado, e clique em OK.
Visual C# Consolidado
1213
Windows automaticamente. Do TableAdapter se voc criar sua consulta de no criador DataSet, como mostrado no ltimo conjunto de etapas, nenhuma interface de usurio gerado automaticamente. Para configurar para especificar um parmetro usando o Windows Forms Designer 1. Arraste uma tabela no formato DataGrid ou Detalhes da janela Data Sources para o formulrio no designer. Voc pode selecionar o formato, clique na seta no canto direito do nome da tabela. 2. Clique na marca inteligente no componente arrastada, e no menu de atalho, clique em Add Query Se voc no estiver usando um mouse, o atalho de teclado para abrir a Tasks caixa de dilogo SHIFT + ALT + F10. 3. 4. Na caixa Search Criteria Builder de dilogo, selecione New query name. Usar o nome padro ou criar um nome de sua escolha. Agora voc pode especificar os parmetros ou clicando Query Builder, alterando a instruo SQL na caixa Query Text. Adicionar uma WHERE clusula ao final da instruo SELECT. Clique OK para fechar a Search Criteria Builder caixa de dilogo. Um boto vinculado consulta- exibido no formulrio no designer. Para especificar um parmetro usando Construtor de consultas 1.
o
Na caixa Query Builder de dilogo, ambos: Adicione uma WHERE clusula no painel da instruo SQL. OuInsira seu parmetro Filter na listagem apropriada Column. Essa abordagem grava a WHERE clusula para voc no painel da instruo SQL. Clique OK para fechar a Query Builder caixa de dilogo. Clique OK para fechar a Search Criteria Builder caixa de dilogo. Um boto vinculado consulta- exibido no formulrio no designer.
2. 3.
Para especificar um parmetro utilizando o criador DataSet 1. 2. 3. 4. 5. 6. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd, e clique em Open. No Dataset Designer, clique com boto direito aponte para Add, e, no menu de atalho, clique em Query. o TableAdapter, No Assistente para configurao Query TableAdapter, selecionar Use SQL Statements, e clique em Next Na pgina Choose a Query Type, selecionar Select which returns a single value, e clique em Next Na pgina Specify a SQL SELECT statement, clique em Query Builder. Se voc desejar, voc pode adicionar a WHERE clusula aqui. Use Construtor de Consultas conforme descrito anteriormente contidas neste tpico. Observao
Visual C# Consolidado
1214
H elementos da interface do usurio so gerados automaticamente quando voc cria suas consultas usando o TableAdapter Query Configuration Wizard.
Visual C# Consolidado
1215
1.
(Visual Basic) No menu File em Visual Studio 2005, clique em New Project. ou (Visual C#) No menu File do Visual Studio 2005, aponte para New, e clique em Project.
2.
Project Types Na caixa New Project de dilogo, expanda Visual Basic ou Visual C# expandir Smart Device, e clique em Pocket PC 2003. Se no o idioma a ser exibido, no no primeiro expandir Other Languages. Esta tela regida por suas configuraes de desenvolvimento.
3.
Em Templates, clique em Device Application. Observao No selecione Device Application (1.0), que depende da verso 1,0 do .NET Compact Framework e no adequado para essa explicao passo a passo.
4. 5. 6.
Na caixa Name, digite ParamQuerySample. (C Visual #) somente Na caixa Location, Verifique onde voc deseja armazenar seus arquivos de projeto. Clique em OK. Aparece uma representao de um dispositivo Pocket PC no Windows Forms Designer. Adicionando funcionalidade de dados
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.
Visual C# Consolidado
1216
3. 4. 5. 6. 7.
Na caixa Add Connection de dilogo, selecione My Computer. Novamente na caixa Add Connection de dilogo, clique em Browse. Na caixa Select SQL Server Mobile Edition Database File de dilogo, selecionar Northwind.sdf, e clique em Open Na caixa Add Connection de dilogo, deixe a Password caixa vazia. Este banco de dados tem nenhuma senha. Clique Test Connection para verificar a conexo. Observao Se o acesso para o Northwind.sdf arquivo for negado, copiar o arquivo para a rea de trabalho, e procure a essa cpia para abrir. Esta situao pode ocorrer se voc no tem direitos suficientes no computador de desenvolvimento para abrir o arquivo no seu local padro, que listado para o incio dessa explicao passo a passo.
8. 9.
Clique OK na caixa de mensagem que mostra a conexo bem-sucedida, e clique OK para fechar a Add Connection caixa de dilogo. Feche a Choose Your Data Connection pgina clicando Next.
10. Na caixa de mensagem que pergunta se voc deseja copiar o arquivo para seu projeto, clique em Yes.
1. 2. 3. 4.
Clique com o boto direito do mouse no PARAM1 controle rtulo no designer, e no menu de atalho, clique em Properties Alterar a Text propriedade para Order ID. Selecionar o FillBy boto, e altere sua propriedade de texto como Show country. Expanda Painel e controles para eliminar as barras de rolagem e mostrar todo o texto. Cuidado principalmente que. e sua caixa de texto no estiver oculto atrs e seus controles o Ship_CountryLabel o FillByPanel Testar o aplicativo
Nesta seo voc criar o aplicativo, baix-lo para o emulador se Pocket PC 2003, e verifique se o aplicativo funciona corretamente.
Visual C# Consolidado
1218
1. 2. 3.
Arraste a tabela mestre da janela Data Sources para o formulrio no designer. Na janela Data Sources, expanda a tabela mestre para expor a tabela de detalhes. Arraste a tabela de detalhes que voc encontrar dentro do n de tabela mestre para o formulrio. Observao Esta a tabela de detalhes como ele aparece dentro da tabela mestre, no a tabela de detalhes que est no mesmo nvel de rvore como a tabela mestra.
4.
O designer detecta automaticamente a Relao mestre-detalhes das restries de chave externas. Para obter mais informaes, consulte Passo-a-passo: Um Aplicativo MasterDetail do SQL Server Mobile. Ajuste os controles no formulrio para atender seu aplicativo.
5.
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.
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
Visual C# Consolidado
1220
Observao Dependendo configuraes e projetos anteriores, caixa Add Connection de dilogo pode aparecer em vez da caixa Choose Data Source de dilogo. Se isso acontecer, clique Change na caixa Add Connection de dilogo para abrir a Change Data Source caixa de dilogo. Selecione Microsoft SQL Server Mobile Edition e clique em OK. 3. 4. 5. 6. 7. Na caixa Add Connection de dilogo, selecione My Computer. Novamente na caixa Add Connection de dilogo, clique em Browse. Na caixa Select SQL Server Mobile Edition Database File de dilogo, selecionar Northwind.sdf, e clique em Open Na caixa Add Connection de dilogo, deixe a Password caixa vazia. Este banco de dados tem nenhuma senha. Clique Test Connection para verificar a conexo. Observao Se o acesso para o Northwind.sdf arquivo for negado, copiar o arquivo para a rea de trabalho, e procure a essa cpia para abrir. Esta situao pode ocorrer se voc no tem direitos suficientes no computador de desenvolvimento para abrir o arquivo no seu local padro, que listada no incio dessa explicao passo a passo. 8. 9. Clique OK na caixa de mensagem que mostra a conexo bem-sucedida, e clique OK para fechar a Add Connection caixa de dilogo. Feche a Choose Your Data Connection pgina clicando Next.
10. Na caixa de mensagem que pergunta se voc deseja copiar o arquivo para seu projeto, clique em Yes.
Visual C# Consolidado
1221
est no mesmo nvel de rvore como a Customers tabela. 4. 5. Clique na seta suspensa para esta Orders Tabela, e selecione a DataGrid opo. Arraste esta Orders tabela da janela Data Sources para o formulrio no designer. Localize a grade a parte inferior da janela. Testar o aplicativo Nesta seo voc criar o aplicativo, baix-lo para o emulador se Pocket PC 2003, e verifique se o aplicativo funciona corretamente.
Visual C# Consolidado
1222
1. 2. 3.
No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo dados para expor a listagem de tabela. Clique com o boto direito do mouse na tabela cujos dados voc deseja exibir e, no menu de atalho, clique em Open. No menu Data, clique em Show Data Sources. Na Data Sources janela, clique com boto direito a fonte de dados cujos dados voc deseja exibir (por exemplo, uma tabela). No menu de atalho, clique em Preview Data. Na caixa Data Preview de dilogo, clique em Preview. No designer, clique na marca inteligente sobre o controle DataGrid. No menu DataGrid Tasks de atalho, clique em Preview Data. Na caixa Preview Data de dilogo, selecione o objeto para visualizar e clique em Preview. Os dados aparecero na caixa Results. O nmero de colunas e linhas na grade tambm exibido na parte inferior da caixa Preview Data de dilogo.
Como: Gerar resumo e modos de exibio de edio para aplicativos de dados (Dispositivos)
Usar formulrios de dados para exibir e editar linhas de dados em um DataGrid nica. A interface do usurio de formulrio de dados consiste de duas caixas de dilogo: caixa View de dilogo exibe uma exibio de resumo de uma linha DataGrid selecionado, e a Edit caixa de dilogo permite a edio de linha.
Abrir a View caixa de dilogo em um aplicativo em execuo clicando duas vezes uma linha no DataGrid no emulador de dispositivo ou tocando em uma linha em um dispositivo. Voc abrir a Edit caixa de dilogo ao clicar em (tocando) New quando o DataGrid exibida Esta ao cria uma nova linha no DataGrid ou clicando (tocando) Edit quando a View caixa de dilogo exibida.
Formulrios de dados so criados como modelos para personalizao. Voc deve adicionar cdigo adequado para validar e confirmar alteraes para o banco de dados como parte dessa personalizao. As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Data Sources. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Para gerar os formulrios de dados 1. Arraste uma tabela no formato DataGrid da janela Data Sources para o formulrio no designer. Voc pode selecionar o formato, clique na seta no canto direito do nome da tabela. 2. Clique na marca inteligente no componente arrastada, e no menu de atalho, selecione Generate Data Forms. (Se no estiver usando um mouse, o atalho do teclado para abrir a Tasks caixa de dilogo SHIFT + ALT + F10.) Observao
Visual C# Consolidado
1223
As caixas de dilogo brevemente so exibidas como eles so gerados no designer. Para verificar se as caixas de dilogo so agora parte do projeto, procure-los Solution Explorer. Para modificar dados em um aplicativo em execuo 1. 2. Iniciar o aplicativo de dados. O DataGrid exibida, preenchida com dados. Clique duas vezes uma linha de dados. Uma exibio de linha de resumo aparece na caixa View de dilogo. Esta exibio consiste em um rtulo e dados para cada coluna que possui contedo. Isto , caixa View de dilogo oculta qualquer coluna cujo valor DBNULL. 3. No menu principal, clique Edit para abrir a Edit caixa de dilogo. Usar a Edit caixa de dilogo que exibe todas as colunas, para modificar os dados, e clique em OK. Os dados revisados so exibidos no DataGrid. Para criar uma nova linha no DataGrid em um aplicativo em execuo 1. Com um aberto DataGrid, no menu principal, clique em New. A Edit caixa de dilogo ser exibida.Use esta caixa de dilogo para adicionar uma nova linha de dados. 2. Clique em OK. A nova linha ser adicionada para o DataGrid.
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
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
Voc tambm pode usar esta janela para alterar o nome do fabricante e para especificar o mnimo e mximo permitido verses do sistema operacional. Voc pode definir a OSVersionMin propriedade para 4.21 para indicar que o aplicativo Pocket PC possui reconhecimento orientao da tela. No entanto, definindo essa propriedade para 4.21 voc impedir o aplicativo de instalao em Pocket PCs baseados no Windows Mobile 2003 e anteriormente. Para permitir instalao em dispositivos e tambm indicar conscientizao orientao de tela a dispositivos mais recentes voc deve editar o
Visual C# Consolidado
1225
arquivo.inf para definir a BuildMax propriedade com um dos seguintes valores: manualmente 0xA0000000 para indicar o aplicativo oferece suporte (pixels) 240x240 telas quadradas 0xC0000000 para indicar o aplicativo suporta Rotao da tela Ou0xE0000000 para indicar o aplicativo suporta telas quadradas e Rotao da tela. Para obter mais informaes, consulte o informe oficial Desenvolvendo aplicativos Aware Orientation-da tela MSDN.
o
Para solues Pocket PC baseadas em Windows Mobile 2003SE e anterior, a Compress propriedade e a NoUninstall Device Deployment propriedade deve ser falsos. Digite observe essa opo pode ser definida como true para dispositivos equipados com Compact Framework 2.0. Para obter mais informaes, consulte Janela Propriedades, Project CAB de dispositivos inteligentes. Se voc estiver usando uma configurao Windows CE DLL, usar essa grade propriedade para especificar o nome e local do arquivo. Para obter mais informaes sobre instalao Windows CE DLLs, consulte a documentao Pocket PC ou Smartphone SDK.
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.
No Solution Explorer, clique com o boto direito do mouse em seu nome de projeto CAB, depois aponte para Add, e clique em File Navigate to <Visual Studio installation folder>\VC\ce\dll\armv4. Selecione os arquivos para adicionar. Para um projeto MFC, pressione CTRL e clique MFC80U.DLL, atl80.dll, e msvcrt80.dll. Talvez tambm precise Clique em uma ou mais das DLLs especficos do idioma se seu aplicativo exigir recursos especficos do idioma MFC. Para um Projeto ATL, pressione CTRL e clique atl80.dll e msvcrt80.dll. Se sua soluo ATL suporta MFC, clique em MFC80U.DLL tambm. Para um projeto Win32, clique em msvcrt80.dll. Clique Open na caixa Add Files de dilogo para adicionar os arquivos no seu projeto CAB. No painel esquerdo do File System Editor, clique com boto direito File System on Target Machine. Clique em Add Special Folder e, clique em Windows Folder. No painel esquerdo de File System Editor, clique na pasta que contm a sada principal. As DLLs tenham sido adicionadas por padro para a mesma pasta como a Sada principal. Para mov-los para a pasta Windows, selecione os arquivos no painel central da File System Editor, arraste.-los sobre para o Windows Folder cone Use o mesmo procedimento para adicionar qualquer outras dependncias exigidas pela sua soluo. Voc pode adicionar dependncias em qualquer pasta; no necessrio para adicion-los pasta Windows.
o o
4. 5. 6. 7.
8.
Visual C# Consolidado
1227
4. 5. 6. 7.
Quando a New Key entrada for exibida na, a Registry Editor renomeao-lo SOFTWARE. Clique com o boto direito do mouse essa nova chave, aponte para New, e clique em Key Quando a New Key entrada for exibida na, a Registry Editor renomeao-lo MyCompany. Clique com o boto direito do mouse na MyCompany entrada, e clique em Janela de Propriedades no menu de atalho O Name valor foi alterado para MyCompany. Criando e Implantando o arquivo CAB
Visual C# Consolidado
1228
Como voc acessar a Select Certificate caixa de dilogo depende do tipo de projeto que voc deseja assinar.
No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no menu de atalho, clique em Properties. Continuar usando um dos seguintes procedimentos: Para projetos do Visual Basic e Visual C# selecione Authenticode Signature, e clique em Select Certificate.: a Project Designer, clique Devices em Em projetos Visual C++, selecionar Authenticode Signing, e clique no boto de reticncias na linha Certificate propriedade Em projetos inteligente CAB dispositivo, selecione Authenticode Signing, e depois clique em Select from Store.
Selecionar um certificado para um projeto de dispositivo Aps voc ter exibido caixa Select Certificate de dilogo conforme descrito em etapas anteriores, voc pode selecionar o certificado a ser.
Para selecionar um certificado para o projeto usando a caixa de dilogo Selecionar certificado
Se a Select Certificate caixa de dilogo exibe o certificado a ser para o projeto, selecione o certificado, e clique em OK O projeto est assinado com esse certificado quando o projeto criado. Se a Select Certificate caixa de dilogo no exibir o certificado a ser para o projeto, voc pode importar um certificado usando o Certificate Import Wizard.
Importar um certificado para um projeto de dispositivo As etapas a seguir mostram como preencher a Select Certificate caixa de dilogo ao importar os certificados de teste fornecidos pelo Visual Studio e aplicao da um projeto. Voc pode seguir esse mesmo procedimento se voc desejar aplicar um certificado diferente. Fornece Visual Studio trs elementos da interface do usurio para a tarefa de importar um certificado para aplicar a um projeto:
A Select Certificate caixa de dilogo que especifica quais certificados so a serem aplicadas ao projeto atual. A Manage Certificates caixa de dilogo que lista o certificado arquivos disponvel no computador de desenvolvimento. O Assistente para importao de certificados que guiar voc selecionar o arquivo de certificado e especificar onde deseja armazen-lo.
Visual C# Consolidado
1229
4.
Clique Browse para navegar para a TestCertificates pasta no Visual Studio. Por padro, esta pasta est localizada em \Program Files\Microsoft 8\SmartDevices\SDK\SDKTools Visual Studio.
5. 6. 7. 8. 9.
Alterar a Files of Type seleo para All Files (*.*), selecionar TestCert_Privileged.pfx ou TestCert_Unprivileged.pfx. e, em seguida clique em Open Na pgina File to Import do assistente, clique Next para abrir a Password pgina. Deixe a Passwod caixa em branco. Esses teste certificados no tem uma senha. Clique Next para abrir a Certificate Store pgina. Certifique-se de que Personal est marcada na caixa Certificate store. Clique Next para exibir a pgina de concluso, e clique em Finish. A mensagem Import was successful exibida. Clique OK para ignorar a mensagem. O certificado agora aparece na lista Manage Certificates. Clique Close para retornar caixa Select Certificate de dilogo.
10. Selecione o certificado que desejar e clique em OK. O certificado agora listado na pgina de propriedades iniciado a partir.
Visual C# Consolidado
1230
Para obter mais informaes sobre como executar signtool a partir da linha de comando, consulte SignTool.
O ActiveSync. RapiConfig.exe. Consulta armazenamento certificado XML arquivo (CertStoreQuery.xml). 1. 2. Estabelecer uma conexo do ActiveSync para o dispositivo. Digite o seguinte comando no prompt de comando, onde certstorequery.xml armazenamento de certificado o arquivo XML de consulta:
Rapiconfig.exe /P /M <certstorequery.xml>
3.
Visual C# Consolidado
1231
4.
o o
Na caixa Select Certificate de dilogo: Se o certificado a ser exibido na lista, selecione-, e clique OK para fechar a caixa de dilogo. Se o certificado a ser no aparecer na lista, clique Manage Certificates para abrir a Manage Certificates caixa de dilogo. Para obter mais informaes, consulte Como Importar e Aplicar Certificados em Projetos de Dispositivos. Quando voc tiver terminado adquirir o certificado, clique OK na caixa Select Certificate de dilogo. Detalhes do Certificado aparecem na janela Application Signing da pgina Devices.
No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu de atalho, clique em Properties. Na pgina Signing, clique em Sign the assembly. Na caixa Choose a strong name key file: Se voc desejar usar um arquivo de chave de nome de alta segurana j existente, clique <Browse> para abrir caixa Select File de dilogo. Se voc desejar criar um novo arquivo de chave de nome de alta segurana, clique para abrir a Create Strong Name Key caixa de dilogo. New Aps completar as etapas acima, clique em Delay sign only.
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).
Visual C# Consolidado
1232
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para assinar um arquivo.cab de Dispositivo Inteligente 1. 2. 3. 4.
o o
No Solution Explorer, clique com o projeto CAB dispositivo inteligente, e clique Properties no menu de atalho Na pgina Build, selecione Authenticode Signature. Clique em Select from Store. Na caixa Select Certificate de dilogo: Se o certificado a ser exibido na lista, selecione-, e clique OK para fechar a caixa de dilogo. Se o certificado a ser no aparecer na lista, clique Manage Certificates para abrir a Manage Certificates caixa de dilogo. Para obter mais informaes, consulte Como Importar e Aplicar Certificados em Projetos de Dispositivos. Quando voc tiver terminado adquirir o certificado, clique OK na caixa Select Certificate de dilogo. O certificado aparecer na caixa Certificate da pgina Build.
5.
Voc ter um projeto de dispositivos inteligentes Visual Basic ou Visual C# em sua soluo. Para obter mais informaes, consulte Programao para Dispositivos usando o .NET Compact Framework. Voc entrou o aplicativo. Para obter mais informaes, consulte Como: Assinar um aplicativo Visual Basic ou Visual C# (Dispositivos). Observao
As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para configurar um dispositivo em um projeto de dispositivo gerenciado 1. 2. 3.
o o
No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu de atalho, clique em Properties. Abra a Devices pgina. Na caixa Device provisioning, selecione uma das opes a seguir: O dispositivo de destino no Provision Configurar o armazenamento Privileged
Visual C# Consolidado
1233
Locked.XML define o seguinte modelo de segurana em duas camadas: Notifique-o antes de executar aplicativos. No execute aplicativos no assinados. Prompt.XML define o seguinte modelo de segurana em duas camadas: Notifique-o antes de executar aplicativos. Executar aplicativos sem assinatura como sem privilgios. Open.XML define o modelo de segurana-uma camada a seguir: No solicitar. Executar todos os aplicativos, incluindo no assinados, como privilegiado.
Os seguintes componentes sero necessrias a fim de configurar o dispositivo com um modelo de segurana:
O ActiveSync. RapiConfig.exe, localizado, por padro em \Program Files\Microsoft 8\SmartDevices\SDK\SDKTools Visual Studio. Arquivo XML de segurana. 1. 2. Estabelecer uma conexo do ActiveSync para o dispositivo. Digite o seguinte comando no prompt de comando, onde securityfile.xml o arquivo XML de modelo de segurana:
RapiConfig.exe /P /M <securityfile.xml>
Visual C# Consolidado
1234
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