{"id":2913,"date":"2019-11-20T05:50:39","date_gmt":"2019-11-20T11:50:39","guid":{"rendered":"https:\/\/www.itexto.com.br\/devkico\/?p=2913"},"modified":"2019-11-20T08:44:00","modified_gmt":"2019-11-20T11:44:00","slug":"do-java-ao-net-parte-2-arquitetura","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2913","title":{"rendered":"Do Java ao .NET &#8211; Parte 2: Arquitetura"},"content":{"rendered":"\n<p>Ent\u00e3o voc\u00ea desenvolve em Java e precisa aprender .NET? Estou na mesma situa\u00e7\u00e3o: acompanhe estes posts pra que juntos dominemos o .NET. Neste post vamos entender a arquitetura fundamental do .NET. Bora l\u00e1?<\/p>\n\n\n\n<p>No<a href=\"https:\/\/www.itexto.com.br\/devkico\/?p=2893\"> post anterior<\/a> expus as diferentes implementa\u00e7\u00f5es do .NET que existem hoje (ao menos as mais populares). Apesar de serem v\u00e1rias implementa\u00e7\u00f5es todas possuem elementos em comum, que ser\u00e3o tratados neste post. Como ver\u00e1 s\u00e3o elementos an\u00e1logos aos que temos no Java, o que torna a sua compreens\u00e3o algo muito mais tranquilo por n\u00f3s.<\/p>\n\n\n\n<p>Neste post vou apresentar a arquitetura essencial da plataforma .net e alguns detalhes relacionados \u00e0 execu\u00e7\u00e3o do c\u00f3digo que chamaram minha aten\u00e7\u00e3o.<\/p>\n\n\n\n<p><strong>Importante<\/strong>: estes posts s\u00e3o o resultado de uma imers\u00e3o .NET que estou realizando. N\u00e3o sou um expert no assunto: caso encontre erros, por favor, me informe nos coment\u00e1rios, eles ajudam muito no nosso aprendizado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Os elementos essenciais<\/h2>\n\n\n\n<p>Na documenta\u00e7\u00e3o oficial da Microsoft voc\u00ea encontrar\u00e1 uma descri\u00e7\u00e3o que diz haver dois elementos essenciais na plataforma .NET:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>O Common Language Runtime (CLR) &#8211; que \u00e9 o respons\u00e1vel pela execu\u00e7\u00e3o do nosso c\u00f3digo.<\/li><li>A biblioteca de classes (Class Library) &#8211; que \u00e9 a API essencial de desenvolvimento.<\/li><li><\/li><\/ul>\n\n\n\n<p>No link &#8220;<a href=\"https:\/\/dotnet.microsoft.com\/learn\/dotnet\/what-is-dotnet-framework\">What is .NET Framework&#8221;<\/a> voc\u00ea vai encontrar a imagem a seguir: voc\u00ea, que usa Java no seu dia a dia, olhe com muita aten\u00e7\u00e3o e me diga se n\u00e3o vai te parecer MUITO familiar.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"464\" height=\"670\" src=\"https:\/\/www.itexto.com.br\/devkico\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net_what_is_dotnet_framework.png\" alt=\"\" class=\"wp-image-2917\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net_what_is_dotnet_framework.png 464w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net_what_is_dotnet_framework-208x300.png 208w\" sizes=\"(max-width: 464px) 100vw, 464px\" \/><\/figure><\/div>\n\n\n\n<p>\u00c9 tal como no Java. O nome da plataforma Java \u00e9 p\u00e9ssimo por que confunde a linguagem com a plataforma, mas desde o in\u00edcio (ou quase) n\u00f3s temos no Java a possibilidade de termos m\u00faltiplas linguagens de programa\u00e7\u00e3o.<\/p>\n\n\n\n<p>Assim como no Java toda linguagem de programa\u00e7\u00e3o \u00e9 compat\u00edvel com a JVM se gerar bytecode que possa ser executado por esta, a MESMA coisa ocorre no .NET. A diferen\u00e7a \u00e9 que a Microsoft fez um trabalho de comunica\u00e7\u00e3o muito melhor: pra come\u00e7ar sua plataforma n\u00e3o tem o mesmo nome que uma de suas linguagens, o que ajuda a entender melhor a diversidade de op\u00e7\u00f5es.<\/p>\n\n\n\n<p>Mas h\u00e1 uma diferen\u00e7a: no caso do Java o c\u00f3digo vira bytecode que \u00e9 interpretado pela JVM (e recompilado durante sua execu\u00e7\u00e3o varias vezes pelo JIT). No caso do .net \u00e9 gerado c\u00f3digo em um formato chamado CIL (Common Intermediate Language), que \u00e9 compilado pelo CLR para c\u00f3digo de m\u00e1quina e na sequ\u00eancia executado. <\/p>\n\n\n\n<p>(Como nota hist\u00f3rica, j\u00e1 tivemos algo similar no Java: o JRockit, JVM da BEA que foi comprada pela Oracle e na sequ\u00eancia descontinuado, fazia algo nesta dire\u00e7\u00e3o. <br>Dica off topic: quer aprender MUITO sobre como a JVM funciona? Leia <a href=\"https:\/\/www.amazon.com\/Oracle-JRockit-Definitive-Marcus-Hirt\/dp\/1847198066\">este livro<\/a>.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O Common Language Runtime (CLR) e assemblies<\/h2>\n\n\n\n<p>Pense inicialmente no CLR como a &#8220;JVM do .net&#8221;. \u00c9 neste componente que est\u00e3o definidos, por exemplo, quais os tipos que ser\u00e3o usados por todas as linguagens de programa\u00e7\u00e3o que geram c\u00f3digo intermedi\u00e1rio (CIL) que ser\u00e1 compilado por este.<\/p>\n\n\n\n<p>Falando deste modo voc\u00ea pode pensar que temos essencialmente um compilador de c\u00f3digo intermedi\u00e1rio para c\u00f3digo de m\u00e1quina apenas, mas o CLR vai al\u00e9m disto. Ele tamb\u00e9m \u00e9 respons\u00e1vel por:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Controle de seguran\u00e7a de acesso.<\/li><li>Defini\u00e7\u00e3o de tipos essenciais (falei acima).<\/li><li>Controle de threads.<\/li><li>Compila\u00e7\u00e3o de c\u00f3digo CIL para c\u00f3digo Nativo e execu\u00e7\u00e3o deste c\u00f3digo.<\/li><li>Ger\u00eancia de mem\u00f3ria atrav\u00e9s de um garbage collector, como no caso do Java.<\/li><li>Gest\u00e3o de application domains, ou seja, isolamento de aplica\u00e7\u00f5es no .net, tal como processos do sistema operacional.<\/li><\/ul>\n\n\n\n<p>Sobre o c\u00f3digo intermedi\u00e1rio &#8211; CIL &#8211; pense neste como o &#8220;bytecode do .net&#8221;. Ele \u00e9 exatamente isto: quando compilamos nosso c\u00f3digo C#, F#, VB.net ou qualquer outra linguagem para este formato, geramos bin\u00e1rios com a extens\u00e3o .exe ou .dll.<\/p>\n\n\n\n<p>Estes arquivos s\u00e3o o que no .net chamamos de <a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/assembly\/\">assemblies<\/a>. Pense nos assemblies como os &#8220;arquivos JAR do Java que voc\u00ea sempre quis ter&#8221;. Eu j\u00e1 os vejo como um &#8220;quase <a href=\"https:\/\/pt.wikipedia.org\/wiki\/OSGi\">OSGi<\/a>&#8220;.<\/p>\n\n\n\n<p>(na minha opini\u00e3o a iniciativa OSGi foi a maior oportunidade perdida da hist\u00f3ria da plataforma Java: se n\u00e3o conhece, pesquise a respeito)<\/p>\n\n\n\n<p>Isto por que estes arquivos (que s\u00e3o essencialmente arquivos zip, tais como os arquivos JAR &#8211; renomeie um e experimente) cont\u00e9m n\u00e3o s\u00f3 o c\u00f3digo CIL, mas tamb\u00e9m importantes metadados:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Qual a vers\u00e3o do pacote (assembly).<\/li><li>Quais classes poder\u00e3o ser expostas (voc\u00ea tem no .net a possibilidade de declarar classes (tipos) como privados e vis\u00edveis apenas dentro do pacote (olha que coisa linda!)).<\/li><li>Conte\u00fados est\u00e1ticos como imagens, arquivos, recursos de internacionaliza\u00e7\u00e3o.<\/li><\/ul>\n\n\n\n<p>Uma das maravilhas do .net \u00e9 que voc\u00ea pode ter instaladas diferentes vers\u00f5es da plataforma em um mesmo computador e, com isto, ter diferentes programas, implementados para diferentes vers\u00f5es do .net executando em paralelo (<em>side by side execution<\/em>).<\/p>\n\n\n\n<p>E sabe este neg\u00f3cio de no assembly ter entre os metadados a vers\u00e3o do pacote? No momento em que voc\u00ea compila seu programa informa qual vers\u00e3o da biblioteca quer usar: se houver mais de uma vers\u00e3o instalada da mesma biblioteca no seu computador o CLR seleciona a vers\u00e3o correta para voc\u00ea. Lindo isto, n\u00e9?<\/p>\n\n\n\n<p>N\u00e3o entendeu por que \u00e9 lindo? Coloque ent\u00e3o no seu classpath duas vers\u00f5es distintas de um framework como o Hibernate, por exemplo (vers\u00e3o 2 e 5) e me diga o que acontece com seu sistema Java. Na plataforma Java a iniciativa OSGi tinha entre os seus objetivos resolver justamente isto: infelizmente n\u00e3o foi pra frente, e mesmo iniciativas como o Jigsaw n\u00e3o chegam nem perto do que o OSGi prometia e cumpria (uma pena).<\/p>\n\n\n\n<p>Desenvolvedor Java, pense o seguinte: ao inv\u00e9s de termos a JVM interpretando bytecode do JAR, teremos o CLR compilando para c\u00f3digo nativo e, na sequ\u00eancia, o executando. Em teoria o tempo de inicializa\u00e7\u00e3o ser\u00e1 bem menor.<\/p>\n\n\n\n<p>Algo que voc\u00ea deve ter em mente: o ambiente .net \u00e9 para o desenvolvimento de <strong>componentes<\/strong>. Cada assembly \u00e9 um comnponente, isto \u00e9, tem bem definido o seu nome, vers\u00e3o e aquilo que deve ser exposto ou n\u00e3o.<\/p>\n\n\n\n<p>(Estou estudando muito a fundo o conceito de assemblies no .net: aguardem um post futuro s\u00f3 sobre este tema)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Links para se aprofundar:<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>.NET Common Language Runtime Components &#8211; \u00e9 um texto de 2003 que mostra em detalhes como os assemblies s\u00e3o organizados e os principais componentes do CLR. Leitura bruta, vale \u00e0 pena &#8211;  <br><a href=\"http:\/\/www.informit.com\/articles\/article.aspx?p=30601\">http:\/\/www.informit.com\/articles\/article.aspx?p=30601<\/a>  <\/li><li>Common Language Runtime Overview &#8211; direto da documenta\u00e7\u00e3o da Microsoft, oferece uma vis\u00e3o macro sobre este componente:  <br><a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/clr\">https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/clr<\/a>  <\/li><li>Assemblies in .NET &#8211; direto da documenta\u00e7\u00e3o da Microsoft, exp\u00f5e uma vis\u00e3o geral sobre os assemblies &#8211;  <br><a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/assembly\/index\">https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/assembly\/index<\/a>  <\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Notas sobre o GAC &#8211; Global Assembly Cache<\/h3>\n\n\n\n<p>Um componente que voc\u00ea deve prestar muita aten\u00e7\u00e3o \u00e9 o GAC: pense nele como as &#8220;shared libs&#8221; do seu servidor de aplica\u00e7\u00f5es. H\u00e1 situa\u00e7\u00f5es nas quais voc\u00ea ir\u00e1 desejar ter um conjunto de assemblies compartilhados entre diferentes programas.<\/p>\n\n\n\n<p>A Microsoft n\u00e3o recomenda que voc\u00ea fa\u00e7a isto, mas acho importante que voc\u00ea saiba de sua exist\u00eancia para o caso de estar lidando com alguma plataforma legada baseada em .net Framework. Mais detalhes sobre o GAC neste <a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/framework\/app-domains\/gac\">link<\/a>.<\/p>\n\n\n\n<p>Menciono o GAC aqui para que voc\u00ea tamb\u00e9m fa\u00e7a um paralelo com o carregamento de classes no Java. Enquanto no Java n\u00f3s normalmente colocamos as bibliotecas que precisamos ou no pr\u00f3prio pacote WAR (ou EAR ou fat JAR), algo similar ocorre no .net.<\/p>\n\n\n\n<p>Os assemblies ser\u00e3o carregados a partir de um diret\u00f3rio ou a partir do GAC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Biblioteca de Classes &#8211; Class Library<\/h2>\n\n\n\n<p>Finalmente temos o segundo componente: a biblioteca de classes. A partir da vers\u00e3o 4.5 do .net Framework temos o conceito de &#8220;.net Standard&#8221;, que falamos a respeito no <a href=\"https:\/\/www.itexto.com.br\/devkico\/?p=2893\">primeiro post<\/a> desta s\u00e9rie. Apenas para relembrar: o <strong>.net Standard<\/strong> consiste no conjunto de APIs padr\u00e3o que toda implementa\u00e7\u00e3o do .net (a partir da vers\u00e3o 4.5 do .net Framework) deve ter implementada para que seja compat\u00edvel com o padr\u00e3o .net.<\/p>\n\n\n\n<p>Pense na biblioteca de classes portanto como a API b\u00e1sica que v\u00eam no Java SE. Mas \u00e9 importante lembrar que al\u00e9m do .net Standard, as diferentes implementa\u00e7\u00f5es do .net (assunto do <a href=\"https:\/\/www.itexto.com.br\/devkico\/?p=2893\">primeiro post<\/a>) podem ter nesta biblioteca de classes APIs espec\u00edficas para aquela implementa\u00e7\u00e3o.<\/p>\n\n\n\n<p>\u00c9 importante estudar a biblioteca de classes para conhecer os padr\u00f5es de codifica\u00e7\u00e3o que s\u00e3o adotados no .net. Sendo assim recomendo que voc\u00ea leia este <a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/class-library-overview\">link <\/a>para que seu c\u00f3digo tenha menos cara de Java e mais cara de .net no futuro.<\/p>\n\n\n\n<p>N\u00e3o h\u00e1 muito o que dizer a respeito deste assunto, mas \u00e9 importante que voc\u00ea tenha alguns links em m\u00e3os:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Navegador da API .NET &#8211; para que voc\u00ea possa consultar todas as classes disponibilizadas pela biblioteca de classes &#8211;  <br><a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/api\/index\">https:\/\/docs.microsoft.com\/pt-br\/dotnet\/api\/index<\/a>  <\/li><li>Documenta\u00e7\u00e3o oficial do .NET standard &#8211;  <br><a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/net-standard\">https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/net-standard<\/a>  <\/li><li><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo gerenciado e n\u00e3o gerenciado<\/h2>\n\n\n\n<p>No Java \u00e9 poss\u00edvel executar c\u00f3digo nativo atrav\u00e9s do JNI (Java Native Interface), um recurso que pouqu\u00edssimas vezes vi ser usado. No caso do .net Framework a situa\u00e7\u00e3o \u00e9 diferente: voc\u00ea pode executar c\u00f3digo nativo (n\u00e3o gerenciado) de forma direta, e isto \u00e9 muito interessante.<\/p>\n\n\n\n<p>Mas primeiro \u00e9 preciso entender a diferen\u00e7a entre c\u00f3digo gerenciado (managed) e n\u00e3o gerenciado (unmanaged) no .net. <\/p>\n\n\n\n<p>C\u00f3digo n\u00e3o gerenciado (unmanaged) \u00e9 aquele que n\u00e3o \u00e9 executado pelo CLR, ou seja, c\u00f3digo que n\u00e3o foi feito focado em .net. Voc\u00ea pode, por exemplo, executar objetos COM ou mesmo c\u00f3digo escrito em linguagens como C++. Isto \u00e9 muito \u00fatil quando voc\u00ea quer acesso de baix\u00edssimo n\u00edvel ou possui requisitos muito bem definidos de consumo de mem\u00f3ria ou desempenho.<\/p>\n\n\n\n<p>J\u00e1 o c\u00f3digo gerenciado \u00e9 aquele escrito focado na plataforma .net, contido em assemblies e executado pelo CLR. A principal vantagem deste tipo de c\u00f3digo \u00e9 o fato deste ser&#8230;. gerenciado. Voc\u00ea n\u00e3o precisa se preocupar em liberar mem\u00f3ria, gerenciar threads e ainda tem um controle de seguran\u00e7a muito mais sofisticado.<\/p>\n\n\n\n<p>\u00c9 interessante que c\u00f3digo n\u00e3o gerenciado pode iniciar vers\u00f5es do CLR. Por exemplo, o IIS, usado para executar aplica\u00e7\u00f5es ASP.net (e ASP.net core) \u00e9 escrito em c\u00f3digo n\u00e3o gerenciado, e inicia o CLR para executar c\u00f3digo .net, tal como voc\u00ea pode ver neste link da documenta\u00e7\u00e3o da Microsoft (<a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/framework\/get-started\/overview\">Overview of the .NET framework<\/a>).<\/p>\n\n\n\n<p>Como desenvolvedor Java, faz todo sentido esta facilidade na execu\u00e7\u00e3o de c\u00f3digo nativo em .net: afinal de contas, a Microsoft j\u00e1 tinha toda uma estrutura de desenvolvimento Windows que, naturalmente, cai muito bem ser reaproveitada em c\u00f3digo .net.<\/p>\n\n\n\n<p>Ali\u00e1s, \u00e9 muito interessante como em .net o acesso ao c\u00f3digo nativo se manifesta nas linguagens. No C# por exemplo, temos o conceito de &#8220;unsafe code&#8221;, que essencialmente \u00e9 a possibilidade de usarmos ponteiros (como os do C) para apontar para posi\u00e7\u00f5es espec\u00edficas de mem\u00f3ria. Leia mais a respeito neste <a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/csharp\/language-reference\/language-specification\/unsafe-code\">link<\/a>. <\/p>\n\n\n\n<p>Outro ponto em que esta natividade se apresenta \u00e9 no tipo struct: que funciona de forma muito parecida com o que temos no C\/C++ e que \u00e9 algo que sentia uma falta IMENSA no Java. Estes aspectos low code ir\u00e3o aparecer tamb\u00e9m nos tipos apresentados pelo CLR: no .net, ao contr\u00e1rio do Java, temos tipos num\u00e9ricos que s\u00e3o signed e unsigned.<\/p>\n\n\n\n<p>Para aplica\u00e7\u00f5es de neg\u00f3cios normalmente ter tipos com sinal ou sem sinal n\u00e3o fazem diferen\u00e7a (por isto n\u00e3o existem no Java), mas quando voc\u00ea precisa interagir com um protocolo de comunica\u00e7\u00e3o mais baixo n\u00edvel (pense no modbus, por exemplo) ter ou n\u00e3o sinal faz uma grande diferen\u00e7a (j\u00e1 senti muito a falta de tipos sem sinal no Java).<\/p>\n\n\n\n<p>(este aspecto baixo n\u00edvel do .net me surpreendeu muito positivamente)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Links para se aprofundar<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>What is managed code &#8211; Documenta\u00e7\u00e3o oficial da Microsoft:  <br><a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/managed-code\">https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/managed-code<\/a>  <\/li><li>Managed Code and Unmanaged Code in .net &#8211; Um resumo do que falamos &#8211;  <br><a href=\"https:\/\/www.c-sharpcorner.com\/uploadfile\/puranindia\/managed-code-and-unmanaged-code-in-net\/\">https:\/\/www.c-sharpcorner.com\/uploadfile\/puranindia\/managed-code-and-unmanaged-code-in-net\/<\/a>  <\/li><li>Native Interoperability &#8211; como funciona a interoperabilidade nativa no .net &#8211;  <br><a href=\"https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/native-interop\/index\">https:\/\/docs.microsoft.com\/pt-br\/dotnet\/standard\/native-interop\/index<\/a>  <\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Concluindo e prosseguindo<\/h2>\n\n\n\n<p>Como deve ter percebido este post \u00e9 na realidade uma s\u00e9rie de dicas para que voc\u00ea conhe\u00e7a melhor o ambiente de execu\u00e7\u00e3o do c\u00f3digo .net para que possamos dar os pr\u00f3ximos passos. <\/p>\n\n\n\n<p>\u00c9 muito importante que voc\u00ea tenha em mente estes paralelos: CIL\/Bytecode, CLR\/JVM, GAC\/Shared libs, especialmente no que diz respeito \u00e0 execu\u00e7\u00e3o de c\u00f3digo n\u00e3o gerenciado, que \u00e9 algo incomum a n\u00f3s, desenvolvedores Java.<\/p>\n\n\n\n<p>Algo que me ajuda muito tamb\u00e9m \u00e9 o vocabul\u00e1rio: recomendo que quando leia estes links, preste muita aten\u00e7\u00e3o no vocabul\u00e1rio usado pelo pessoal que trabalha com .net. O termo &#8220;tipos&#8221;, por exemplo, representa classes e por a\u00ed vai.<\/p>\n\n\n\n<p>Toquei em apenas alguns pontos neste post: no pr\u00f3ximo pretendo falar um pouco sobre os tipos de dados disponibilizados pela CLR, que s\u00e3o um assunto interessant\u00edssimo e que n\u00e3o \u00e9 intuitivo em diversos aspectos para n\u00f3s, que trabalhamos com Java. At\u00e9 l\u00e1!<\/p>\n\n\n\n<p>PS: lembrem-se que estes posts s\u00e3o o resultado de uma imers\u00e3o que estou realizando e que pode conter erros. Por favor, me digam nos coment\u00e1rios caso os encontrem, ok? Valeu!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para aqueles que est\u00e3o no Java aprendendo .net vamos conhecer neste post como \u00e9 a arquitetura do .net (seus principais componentes) e tamb\u00e9m como o c\u00f3digo \u00e9 executado. Fascinante!<\/p>\n","protected":false},"author":1,"featured_media":2914,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[56,86,6],"tags":[],"class_list":["post-2913","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-do-java-ao-net","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Do Java ao .NET - Parte 2: Arquitetura - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=2913\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Do Java ao .NET - Parte 2: Arquitetura - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Para aqueles que est\u00e3o no Java aprendendo .net vamos conhecer neste post como \u00e9 a arquitetura do .net (seus principais componentes) e tamb\u00e9m como o c\u00f3digo \u00e9 executado. Fascinante!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2913\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-20T11:50:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-20T11:44:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"333\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2913\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2913\",\"name\":\"Do Java ao .NET - Parte 2: Arquitetura - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2913#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2913#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png\",\"datePublished\":\"2019-11-20T11:50:39+00:00\",\"dateModified\":\"2019-11-20T11:44:00+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2913#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2913\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2913#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png\",\"width\":640,\"height\":333},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2913#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Do Java ao .NET &#8211; Parte 2: Arquitetura\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Do Java ao .NET - Parte 2: Arquitetura - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=2913","og_locale":"pt_BR","og_type":"article","og_title":"Do Java ao .NET - Parte 2: Arquitetura - \/dev\/Kico","og_description":"Para aqueles que est\u00e3o no Java aprendendo .net vamos conhecer neste post como \u00e9 a arquitetura do .net (seus principais componentes) e tamb\u00e9m como o c\u00f3digo \u00e9 executado. Fascinante!","og_url":"https:\/\/devkico.itexto.com.br\/?p=2913","og_site_name":"\/dev\/Kico","article_published_time":"2019-11-20T11:50:39+00:00","article_modified_time":"2019-11-20T11:44:00+00:00","og_image":[{"width":640,"height":333,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png","type":"image\/png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2913","url":"https:\/\/devkico.itexto.com.br\/?p=2913","name":"Do Java ao .NET - Parte 2: Arquitetura - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2913#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2913#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png","datePublished":"2019-11-20T11:50:39+00:00","dateModified":"2019-11-20T11:44:00+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2913#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2913"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2913#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png","width":640,"height":333},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2913#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Do Java ao .NET &#8211; Parte 2: Arquitetura"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2019\/11\/arquitetura_dot_net.png","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2913"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2913"}],"version-history":[{"count":5,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2913\/revisions"}],"predecessor-version":[{"id":2920,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2913\/revisions\/2920"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/2914"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}