<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marcos Costa</title>
    <description>The latest articles on DEV Community by Marcos Costa (@marcoscostadev).</description>
    <link>https://dev.to/marcoscostadev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F162859%2Fde91b7b6-d200-4ae8-a614-d0a5b02e9b44.jpeg</url>
      <title>DEV Community: Marcos Costa</title>
      <link>https://dev.to/marcoscostadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcoscostadev"/>
    <language>en</language>
    <item>
      <title>Convenções de Nomes em C#: Como Nomear Variáveis, Métodos e Classes</title>
      <dc:creator>Marcos Costa</dc:creator>
      <pubDate>Wed, 03 Apr 2024 15:22:40 +0000</pubDate>
      <link>https://dev.to/marcoscostadev/convencoes-de-nomes-em-c-como-nomear-variaveis-metodos-e-classes-25gj</link>
      <guid>https://dev.to/marcoscostadev/convencoes-de-nomes-em-c-como-nomear-variaveis-metodos-e-classes-25gj</guid>
      <description>&lt;p&gt;Olá devs, vamos falar de um assunto um pouco polêmico, porque sempre aparece alguém para &lt;del&gt;cagar regra&lt;/del&gt; dizer que devemos escrever o código de maneira X ou Y, e nem sempre isso estar de acordo com a conversão de nomes da linguagem que trabalhamos, então resolvi criar esse mini artigo para &lt;del&gt;cagar regra&lt;/del&gt; ajudar vocês a nomear suas coisas em C# usando o guia oficial da comunidade escrito pela Microsoft.&lt;/p&gt;

&lt;p&gt;Quando escrevemos código é importante seguir algumas convenções de nomenclatura para tornar nosso código mais legível e consistente. então, entenda que essas convenções ajudam a entender o propósito das variáveis, classes e outros elementos do código. Vamos dar uma olhada nelas e entender de uma vez por todas.&lt;/p&gt;

&lt;h2&gt;
  
  
  A PascalCase
&lt;/h2&gt;

&lt;p&gt;Dentro do C#, usamos a &lt;code&gt;PascalCase&lt;/code&gt; para quase tudo, seja nomes de tipos, métodos públicos e propriedades, nomes de arquivos. Isso significa que a primeira letra de cada palavra é maiúscula, e as demais são minúsculas. &lt;br&gt;
Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MinhaClasse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CalcularSalario&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NomeCompleto&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os nomes de namespaces devem seguir a mesma convenção &lt;code&gt;PascalCase&lt;/code&gt;. Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MeuProjeto.Utilitarios&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MeuProjeto.Modelos&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A camelCase
&lt;/h2&gt;

&lt;p&gt;Também usamos a &lt;code&gt;camelCase&lt;/code&gt; Para variáveis locais, parâmetros de método e campos privados. A primeira letra é minúscula, e as demais palavras começam com letra maiúscula.&lt;br&gt;
Exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;idade&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nomeCompleto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quantidadeItens&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agora o mais Difícil (não deveria ser)
&lt;/h2&gt;

&lt;p&gt;Sempre crie nomes autoexplicativos, escolha nomes que sejam descritivos e faça sentido para o que você está fazendo. Por exemplo, em vez de usar a ou &lt;code&gt;x&lt;/code&gt; como nome de variável, prefira algo como &lt;code&gt;idadeDoUsuario&lt;/code&gt; ou &lt;code&gt;totalDeItens&lt;/code&gt;, dessa forma você ajuda seu amiguinho que trabalha com você e &lt;del&gt;não querer te matar&lt;/del&gt; ajudar a equipe a crescer.&lt;/p&gt;

&lt;p&gt;Evite usar caracteres especiais como &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;@&lt;/code&gt;, &lt;code&gt;#&lt;/code&gt; nos nomes de identificadores. Como também abreviações que possam confundir outros desenvolvedores. Por exemplo, em vez de &lt;code&gt;btn&lt;/code&gt;, use &lt;code&gt;botao&lt;/code&gt; para um botão na interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  De onde você tirou isso? do C#?
&lt;/h2&gt;

&lt;p&gt;Todas essas conversões foram tiradas da &lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/fundamentals/coding-style/coding-conventions"&gt;documentação oficial da Microsoft sobre convenções de codificação em C#&lt;/a&gt;.&lt;br&gt;
Porém, é importante salientar que essas convenções não são impostas pelo compilador, mas são amplamente adotadas pela comunidade. Então, segui-las tornará seu código mais fácil de ler e entender, especialmente quando você compartilha seu código com outros desenvolvedores.&lt;/p&gt;

&lt;p&gt;Espero que vocês tenham gostado, se quiser deixar alguma dica e sugestão, correção, deixa aí em baixo nos comentários, Até a próxima!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>namingconversion</category>
      <category>naming</category>
    </item>
    <item>
      <title>MAUI - Por onde começar? Parte 2: O arsenal de ferramentas para desenvolver apps MAUI</title>
      <dc:creator>Marcos Costa</dc:creator>
      <pubDate>Sun, 31 Mar 2024 19:44:19 +0000</pubDate>
      <link>https://dev.to/marcoscostadev/maui-por-onde-comecar-parte-2-o-arsenal-de-ferramentas-para-desenvolver-apps-maui-45il</link>
      <guid>https://dev.to/marcoscostadev/maui-por-onde-comecar-parte-2-o-arsenal-de-ferramentas-para-desenvolver-apps-maui-45il</guid>
      <description>&lt;p&gt;Olá meus amigos, dando continuídade ao nosso artigo anterior &lt;a href="https://dev.to/marcoscostadev/maui-por-onde-comecar-parte-1-entendendo-o-maui-577g"&gt;MAUI - Por onde começar? Parte 1: Entendendo o MAUI&lt;/a&gt; aqui trarei um punhado de ferramentas e biblioteca úteis que em geral eu uso no meu dia-a-dia quando estou desenvolvendo com MAUI. Vamos usar elas no decorrer dessa série de artigos. Estarei indicando ao final das explicações quais ferramentas você deve instalar para dar continuidade. Porém quero explicar mais sobre outras ferramentas existentes para você entender onde e como usar.&lt;/p&gt;




&lt;h2&gt;
  
  
  XAML STYLER
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PlaPvqMu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://teamxavalon.gallerycdn.vsassets.io/extensions/teamxavalon/xamlstyler/3.2311.2/1699944475737/Microsoft.VisualStudio.Services.Icons.Default" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PlaPvqMu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://teamxavalon.gallerycdn.vsassets.io/extensions/teamxavalon/xamlstyler/3.2311.2/1699944475737/Microsoft.VisualStudio.Services.Icons.Default" alt="logo XAML STYLER, apenas um sinal de 'maior que' e outro sinal de 'menor que'" width="128" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A extensão &lt;a href="https://marketplace.visualstudio.com/items?itemName=TeamXavalon.XAMLStyler"&gt;XAML Styler&lt;/a&gt; para o Visual Studio é uma ferramenta valiosa para desenvolvedores que trabalham com XAML. Pois ela torna simples a identação de código XML nos seus arquivos XAML. Ao salvar, ela consegue identificar coisas mal formatadas, tags que estão faltando fechar, analisa sua arvore XML, consequentemente, melhorando a leitura desses arquivos.&lt;/p&gt;

&lt;p&gt;Ele ajuda a manter um estilo de codificação XAML consistente e melhora significativamente a legibilidade do código.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se quiser instalar ela, já pode.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ResX Manager
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EYHskvuI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://tomenglert.gallerycdn.vsassets.io/extensions/tomenglert/resxmanager/1.84.6269.0/1708877402110/Microsoft.VisualStudio.Services.Icons.Default" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EYHskvuI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://tomenglert.gallerycdn.vsassets.io/extensions/tomenglert/resxmanager/1.84.6269.0/1708877402110/Microsoft.VisualStudio.Services.Icons.Default" alt="logo ResX Manager, 3 bandeiras dos países italia, alemanha e estados unidos" width="96" height="96"&gt;&lt;/a&gt;&lt;br&gt;
A extensão &lt;a href="https://marketplace.visualstudio.com/items?itemName=TomEnglert.ResXManager"&gt;ResX Manager&lt;/a&gt; é uma extensão do Visual Studio de longe a ferramenta que eu mais uso, pois ela facilita a criação de aplicativos multiculturais. O ResX Manager mostra todos os arquivos de recursos .resx da solução em uma visualização centralizada. Você pode editar rapidamente as strings diretamente na grade de dados. &lt;br&gt;
 O ResX Manager oferece exportação e importação para facilitar a troca de traduções fora do Visual Studio. Você pode usar API de tradução do google translate, bing e entre outras para ajudar na automatização de suas traduções.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caso deseje proceder com a instalação, já está autorizado.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  CommunityToolkit.Mvvm
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jgr_csCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://api.nuget.org/v3-flatcontainer/communitytoolkit.mvvm/8.2.2/icon" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jgr_csCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://api.nuget.org/v3-flatcontainer/communitytoolkit.mvvm/8.2.2/icon" alt="logo do CommunityToolkit.Mvvm, uma maletinha azul" width="256" height="256"&gt;&lt;/a&gt;&lt;br&gt;
A extensão &lt;code&gt;CommunityToolkit.Mvvm&lt;/code&gt; é uma biblioteca que usaremos através de todo nosso projeto, assim conseguiremos usufruir ao máximo da arquitetura MVVM. Você vai instalar ela usando o &lt;code&gt;Nuget Package Manager&lt;/code&gt; no seu projeto, ou usando o comando abaixo na pasta do seu projeto via terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet add package CommunityToolkit.Mvvm --version 8.2.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A grande vantagem dela é porque ela é agnóstica em relação aos frameworks de interface do usuário (UI), o que significa que pode ser usado em várias plataformas, como UWP, WPF, Xamarin, Uno e entre outras que você desejar implementar a MVVM. Além de ser uma das bibliotecas mais usadas quando se fala de implementação de mvvm.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se assim o desejar, pode prosseguir com a instalação imediatamente.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  CommunityToolkit.Maui
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zLZmbRYf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://api.nuget.org/v3-flatcontainer/communitytoolkit.maui/8.0.0/icon" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zLZmbRYf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://api.nuget.org/v3-flatcontainer/communitytoolkit.maui/8.0.0/icon" alt="logo do CommunityToolkit.Maui, uma maletinha roxa" width="106" height="92"&gt;&lt;/a&gt;&lt;br&gt;
A &lt;a href="https://www.nuget.org/packages/CommunityToolkit.Maui/"&gt;CommunityToolkit.Maui&lt;/a&gt; é uma biblioteca essencial para o desenvolvimento de aplicativos .NET MAUI. Ela trás varios controles de interface pre-prontos, animações, conversores, efeitos, popups, expander. Você pode adiciona-la ao projeto pois facilitará bastante nossa vida.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet add package CommunityToolkit.Maui --version 8.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Caso julgue conveniente, está à disposição para realizar a instalação.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Menções honrosas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SyncFusion&lt;/strong&gt;&lt;br&gt;
Se você deseja ter coisas ainda mais prontas, você pode optar por usar a &lt;a href="https://www.syncfusion.com/maui-controls"&gt;SyncFusion&lt;/a&gt;, ela trás diversos controles prontos que você pode estilizar e usar de graça para projetos onde você tem uma equipe pequena de desenvolvedores ou por uma lincença.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Telerik UI&lt;/strong&gt;&lt;br&gt;
Da mesma forma que a SyncFusion, temos a &lt;a href="https://www.telerik.com/maui-ui"&gt;Telerik UI for MAUI&lt;/a&gt; vários controles pre-prontos que podem ser usados e com suporte do Time Telerik&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blazor-MAUI&lt;/strong&gt;&lt;br&gt;
Opa, o que &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/blazor/?view=aspnetcore-8.0"&gt;blazor&lt;/a&gt; está fazendo aqui? Você pode está me perguntando. Então, acontece que o blazor é uma biblioteca front-end para desenvolvimento de applicações web usando C# e web assembly. Com o &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/blazor/hybrid/tutorials/maui?view=aspnetcore-8.0"&gt;blazor-MAUI&lt;/a&gt; conseguimos trazer toda a experiencia de desenvolver para web para o mundo mobile. Todo blazor é carregador dentro de uma web view e o MAUI como backend, o que permite acessar todos os recursos nativo do dispositivo através do MAUI, enquanto UI para o usuário poderá ser exibida em uma WebView. Isso nós chamamos de desenvolvimento hibrido, assim como fazemos com Ionic Framework + capacitor, mas com uma grande vantagem que você não precisa mudar a linguagem para acessar os recursos nativo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MudBlazor&lt;/strong&gt;&lt;br&gt;
Já que eu estou falando de blazor, porque não falar do &lt;a href="https://www.mudblazor.com/"&gt;MudBlazor&lt;/a&gt;, semelhante ao Angular Material, o MudBlazor traz vário componentes que você pode usar em uma aplicação Blazor (blazor-maui), diversos controles de interfaces estão disponiveis para o seu uso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins, bibliotecas em gerais&lt;/strong&gt;&lt;br&gt;
O MAUI tem uma comunidade muito forte, assim como a do C#, e você pode contar com diversos plugins que lhe ajudarão a criar apps em diferentes plataformas. Temos plugins/bibliotecas para &lt;a href="https://github.com/marcojak/MauiMTAdmob"&gt;AdMob&lt;/a&gt; exibir anúncios, &lt;a href="https://github.com/jamesmontemagno/InAppBillingPlugin"&gt;InApp billing&lt;/a&gt; permite compras de produtos digitais nas lojas, &lt;a href="https://github.com/thudugala/Plugin.LocalNotification"&gt;Local Notifications&lt;/a&gt; para exibir notificações geradas pelo seu app. Entre vário outros, sem falar da gama de bibliotecas que já existem hoje no dotnet que você pode usar, como por exemplo, a &lt;a href="https://serilog.net/"&gt;Serilog&lt;/a&gt;, o &lt;a href="https://github.com/wieslawsoltes/Svg.Skia"&gt;Svg.Skia&lt;/a&gt; entre milhões de outras bibliotecas compatíveis.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tá, e agora?
&lt;/h2&gt;

&lt;p&gt;Agora, você descansa que em breve estaremos começando o nosso projeto, já no próximo artigo. Aguarde!&lt;/p&gt;

&lt;p&gt;Espero que vocês tenham gostado, qualquer dica, sugestão, correção, deixa aí em baixo. Muito obrigado por ter chegado até aqui.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MarcosCostaDev/Maui-por-onde-comecar/tree/0b18897107526877705bb228d1e47859d083267d"&gt;Repositório do GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23zarw81fx0yzrs3fb7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23zarw81fx0yzrs3fb7r.png" alt="meme do personagem perseguindo uma bola amarela com os textos " width="500" height="672"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até a proxima pessoal!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>maui</category>
      <category>android</category>
      <category>ios</category>
    </item>
    <item>
      <title>MAUI - Por onde começar? Parte 1: Entendendo o MAUI</title>
      <dc:creator>Marcos Costa</dc:creator>
      <pubDate>Sun, 31 Mar 2024 17:01:33 +0000</pubDate>
      <link>https://dev.to/marcoscostadev/maui-por-onde-comecar-parte-1-entendendo-o-maui-577g</link>
      <guid>https://dev.to/marcoscostadev/maui-por-onde-comecar-parte-1-entendendo-o-maui-577g</guid>
      <description>&lt;p&gt;Olá amigos, hoje é um dia especial para alguém que &lt;em&gt;&lt;strong&gt;do nada&lt;/strong&gt;&lt;/em&gt; resolveu aprender &lt;strong&gt;MAUI (.NET Multi-platform App UI)&lt;/strong&gt;, se esse é você, então, vem comigo porque eu bolei essa série de artigos que tentarão sanar as dúvidas que mais recebo da comunidade em grupos do telegram que participo, e também, não menos importante, fiz um tutorial com as principais bibliotecas que você deve ter no seu projeto, estrategias de organização de projeto, uso da arquitetura MVVM, Injeção de dependência e muito mais. Prometo ser o mais objetivo possivel nesse post em sanar tais duvidas. Então vamos lá:&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é MAUI e qual a sua diferença para o WPF, UWP e Windows Forms?
&lt;/h2&gt;

&lt;p&gt;Para início de conversa, entenderemos que &lt;strong&gt;MAUI (.NET Multi-platform App UI)&lt;/strong&gt; é uma estrutura multiplataforma &lt;a href="https://github.com/dotnet/maui" rel="noopener noreferrer"&gt;open source&lt;/a&gt; para criar aplicativos moveis usando uma mesma base de código compartilhada, essa estrutura vai te permitir publicar aplicativos para &lt;strong&gt;Android&lt;/strong&gt;, &lt;strong&gt;IOS&lt;/strong&gt;, &lt;strong&gt;Windows **e **MacOS&lt;/strong&gt;. O MAUI é uma evolução do &lt;a href="https://github.com/xamarin/" rel="noopener noreferrer"&gt;Xamarin&lt;/a&gt; que também tem esse mesmo proposito, porem com uma outra arquitetura menos extensiva, dado que nos obriga quase sempre a mudar de projetos para efetuar mudanças de acordo com a plataforma, por exemplo. &lt;/p&gt;

&lt;p&gt;O Principio de criação de interface no MAUI usa principalmente O XAML e C#, o que se assemelha com outras tecnologias para desenvolvimento para Windows desktop como o &lt;strong&gt;WPF (Windows Presentation Foundation)&lt;/strong&gt; e &lt;strong&gt;UWP (Universal Windows Platform)&lt;/strong&gt;. A maior diferença entre essas tecnologias são os propositos delas. Enquanto no WPF a gente somente cria aplicativos para Windows Desktop, ele não é multiplataforma, porém te permite acessar as interface do sistema operacional ao contrario do UWP.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;UWP (Universal Windows Platform)&lt;/strong&gt; é um tipo de arquitetura para desenvolvimento desktop com o diferencial que lhe permite usar a mesma base de código para publicação em outras versões do windows para PC, Tablets, XBOX e Hololens, antigamente era também usado para criação de apps para o finado &lt;em&gt;Windows Phone&lt;/em&gt;. Nele também usamos XAML e C# para criação de interfaces, mas ao contrario do WPF, os apps que rodam nessa tecnologia estarão sendo executados dentro de uma sandbox, e para ter acesso a recursos do sistema operacional, é preciso pedir permissão ao Usuário, semelhante ao que acontece com Android e IOS.&lt;/p&gt;

&lt;p&gt;Vamos falar um pouco do &lt;strong&gt;Windows Forms&lt;/strong&gt;, uma tecnologia antiga, porém viva, e com muitos devs desempenhados em manter assim, é uma tecnologia que foi predecessora do WPF, seu diferencial é que te permite &lt;del&gt;sofrer enquanto estar à&lt;/del&gt; criar aplicativos para windows usando o que chamados de WYSIWYG &lt;em&gt;(what you see is what you get)&lt;/em&gt; e também adicionando controles em tempo de execução, e seus componentes são compativeis com o WPF e vice-versa, ele executa da mesma forma do WPF, e também te permite acessar interfaces do sistema operacional sem pedir permissão como o UWP, porém não é multiplataforma, como também você não tem um XML charmoso onde você pode controlar os controles na interface, restringindo sua interação a clicar e arrastar controles e adicionar eventos para executar comandos.&lt;/p&gt;

&lt;p&gt;Então, resumindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WPF (Windows Presentation Foundation):

&lt;ul&gt;
&lt;li&gt;É uma tecnologia para criar aplicativos de desktop no Windows.&lt;/li&gt;
&lt;li&gt;Usa XAML para definir a interface do usuário.&lt;/li&gt;
&lt;li&gt;Foi projetado principalmente para Windows.&lt;/li&gt;
&lt;li&gt;Não é multiplataforma.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;UWP (Universal Windows Platform):

&lt;ul&gt;
&lt;li&gt;Também é para aplicativos de desktop no Windows.&lt;/li&gt;
&lt;li&gt;Usa XAML e C#.&lt;/li&gt;
&lt;li&gt;Foi projetado para ser executado em várias versões do Windows.&lt;/li&gt;
&lt;li&gt;Suporta dispositivos como PCs, tablets, Xbox e HoloLens.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Windows Forms:

&lt;ul&gt;
&lt;li&gt;É uma tecnologia mais antiga para criar aplicativos de desktop no Windows.&lt;/li&gt;
&lt;li&gt;Usa C# e uma abordagem baseada em eventos.&lt;/li&gt;
&lt;li&gt;Não é multiplataforma.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;.NET MAUI:

&lt;ul&gt;
&lt;li&gt;Unifica as APIs do Android, iOS, macOS e Windows em uma única API.&lt;/li&gt;
&lt;li&gt;Permite compartilhar código, testes e lógica de negócios entre plataformas.&lt;/li&gt;
&lt;li&gt;Oferece controles de interface do usuário recriados do zero para melhor desempenho.&lt;/li&gt;
&lt;li&gt;É a escolha ideal para desenvolvedores que desejam criar aplicativos multiplataforma com uma única base de código.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Vamos ao que interessa, seu primeiro App MAUI!
&lt;/h2&gt;

&lt;p&gt;Ufa, depois dessa longa explicação, agora vamos entender por onde começar. Estarei usando o sistema operacional Windows com o &lt;a href="https://visualstudio.microsoft.com/vs/community/" rel="noopener noreferrer"&gt;Visual Studio Community 2022&lt;/a&gt; para fazer nosso app, nada impede você se usar o &lt;a href="https://code.visualstudio.com/Download" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Então vamos explorar o template inicial que a Microsoft nos fornece  ao criar nosso primeiro app. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos começar criando um novo projeto no visual studio e selecionando o tipo de projeto MAUI como na imagem abaixo: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxrxdwwzrbnl1g3jbtkj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxrxdwwzrbnl1g3jbtkj.png" alt="Selecionando o tipo de projeto .net MAUI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agora vamos dar um nome para ele, vou chamar de "MeuPrimeiroAppMAUI"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9ti25j2w6potdsj59nc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9ti25j2w6potdsj59nc.png" alt="Dando o nome para o projeto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;e voilá, agora temos o nosso projeto aqui, mas o que nós estamos vendo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis7aicivfh1oq4745sg6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis7aicivfh1oq4745sg6.png" alt="Primeira estrutura de pasta"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Entendendo a estrutura padrão de pastas no MAUI
&lt;/h3&gt;

&lt;p&gt;Em geral, como estamos usando .NET, você verá os mesmos elementos de outros tipos de apps do framework, como a sessão de "dependencies" e "properties", mas no MAUI tem umas coisinhas interessantes, deixa eu explicar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dependencias(Dependencies)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa sessão é onde você pode configurar que dependencias seu projeto tem, seja NuGet Packages, outros Projetos e até mesmo Dlls; bom, nada novo até aqui. Porém, no MAUI você vai ver outros tipos de dependencias como &lt;em&gt;net8.0-android&lt;/em&gt;, &lt;em&gt;net8.0-ios&lt;/em&gt; e etc. Mas o que são isso? Em resposta curta, isso determina que exitem dependencias exclusivas para serem publicadas por plataforma, em outra palavras, quando você estiver desenvolvendo para Android, o MAUi vai olhar para as dependencias listadas em &lt;em&gt;net8.0-android&lt;/em&gt;, enquanto para iOS, ele olhará para .net8.0-ios, e assim por diante.&lt;br&gt;
Pô legal, né?! Mas onde isso é configurado?&lt;/p&gt;

&lt;p&gt;Se você usar o botão direito do mouse em cima do projeto e clicar em "Editar arquivo de projeto" (edit project file), voce verá que os tipos de projetos estarão listados bem no inicio em &lt;strong&gt;TargetFrameworks&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TargetFrameworks&amp;gt;&lt;/span&gt;net8.0-android;net8.0-ios;net8.0-maccatalyst&lt;span class="nt"&gt;&amp;lt;/TargetFrameworks&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TargetFrameworks&lt;/span&gt; &lt;span class="na"&gt;Condition=&lt;/span&gt;&lt;span class="s"&gt;"$([MSBuild]::IsOSPlatform('windows'))"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$(TargetFrameworks);net8.0-windows10.0.19041.0&lt;span class="nt"&gt;&amp;lt;/TargetFrameworks&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Você deve ter notado que a estrutura desses target frameworks é sempre (versão do framework)-(plataforma), podendo ser net9.0-android, net6.0-ios, então com isso em mente vamos seguindo.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pasta "Platforms"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa pasta é onde estarão nossos arquivos especificos por plataforma, você deve ver uma pasta "Android", "iOS", "MacCatalyst" , "Tizen" e "Windows". Qualquer classe colocada nesses diretorios, só estarão disponiveis na plataforma correspondente. Então todas as outras pastas que você criar, ou arquivo que estiver fora, será automaticamente interpretado como multiplataforma.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pasta "Resources"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa pasta em geral deixa as pessoas com muitas dúvidas de onde pode colocar imagens, arquivos extras, e alguns devs colocam arquivos em locais que não são apropriados por desconhecer a funcão dessa pasta, então deixa eu desmistificar de acordo com sua intenção: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para imagens deve ser colocadas dentro da pasta "Images", preferencialmente use &lt;em&gt;arquivos svg&lt;/em&gt;, mas pode ser qualquer tipo.&lt;/li&gt;
&lt;li&gt;Para icone do app, aqueles que o usuário verá na área de trabalho, use a pasta "AppIcon", de preferencia &lt;em&gt;arquivos svg&lt;/em&gt; também.&lt;/li&gt;
&lt;li&gt;Para novas fontes, use a pasta "Fonts", nela você pode baixar fontes da internet e colocar nessa pasta e já sair usando ao redor do seu app.&lt;/li&gt;
&lt;li&gt;A pasta "raw" é de longe a que mais sofre de mal uso, então vou desmistificar agora, qualquer arquivo extra, sendo um json, xml, ou  até mesmo qualquer tipo de arquivo, você pode colocar nessa pasta, cada plataforma exige uma API especifica para acessa-la, mas é muito fácil configurar isso.&lt;/li&gt;
&lt;li&gt;A pasta "Splash" é onde colocamos nossas splash screen. SplashScreen é a primeira pagina que o sistema operacional invoca quando chama o seu app para a execução em primeiro plano.&lt;/li&gt;
&lt;li&gt;a pasta "Styles" é onde podemos colocar nossas folhas de estilo compartilhadas, semelhante ao &lt;strong&gt;CSS&lt;/strong&gt;, mas tudo aqui é &lt;strong&gt;XAML&lt;/strong&gt;, vou me aprofundar nisso nos próximos artigos. Você deve perceber que temos um arquivo de cores (Colors.xaml) e um arquivo de estilos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos as pastas acima serão compiladas de diferentes maneiras, mas a RAW ela não é compilada, ela será colocada de forma "bruta" nas pastas equivalentes por plataforma.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;App.xaml e App.xaml.cs (desmistificando de uma vez por todas)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apartir de agoras, você verá um comportamento comum quando você criar novos arquivos xaml no seu projeto, eles sempre virão com um arquivo xaml.cs. Só pra desmistificar a grosso modo essa parte para que você entenda, os arquivos XAML são representacões em XML de código C#, então quando criamos um arquivo XAML devemos entender que basicamente estamos escrevendo código C# de outra maneira, com XML. Dúvida de mim? Então vamos a arquivo do App.xaml&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version = "1.0" encoding = "UTF-8" ?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Application&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/dotnet/2021/maui"&lt;/span&gt;
             &lt;span class="na"&gt;xmlns:x=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/winfx/2009/xaml"&lt;/span&gt;
             &lt;span class="na"&gt;xmlns:local=&lt;/span&gt;&lt;span class="s"&gt;"clr-namespace:MeuPrimeiroAppMAUI"&lt;/span&gt;
             &lt;span class="na"&gt;x:Class=&lt;/span&gt;&lt;span class="s"&gt;"MeuPrimeiroAppMAUI.App"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Application.Resources&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ResourceDictionary&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ResourceDictionary.MergedDictionaries&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;ResourceDictionary&lt;/span&gt; &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;"Resources/Styles/Colors.xaml"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;ResourceDictionary&lt;/span&gt; &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;"Resources/Styles/Styles.xaml"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ResourceDictionary.MergedDictionaries&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ResourceDictionary&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Application.Resources&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Application&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;observe essas linhas&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             xmlns:local="clr-namespace:MeuPrimeiroAppMAUI"
             x:Class="MeuPrimeiroAppMAUI.App"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;e observe o código C# na App.xaml.cs&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nf"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

          &lt;span class="n"&gt;MainPage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;AppShell&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;você deve reparar a palavra-chave "partial" nessa declaração da classe &lt;code&gt;public partial class App : Application&lt;/code&gt;, como também a classe sendo associada ao documento XAML em &lt;code&gt;x:Class="MeuPrimeiroAppMAUI.App&lt;/code&gt;. Usamos &lt;em&gt;Partial _em _C#&lt;/em&gt; quando queremos separar uma classe em duas ou mais documentos sem que isso afete o comportamento dela para compilador. Então, se nosso XAML é uma partial de nossa classe App (que também é uma partial) os dois documentos são representação da mesma classe.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Para que serve a classe App?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A classe App no .NET MAUI desempenha um papel fundamental na criação de aplicativos multiplataforma. Vamos explorar o que ela faz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definição do Aplicativo:
A classe App é o ponto de entrada para o seu aplicativo .NET MAUI. Ela é responsável por inicializar e configurar o aplicativo.

&lt;ul&gt;
&lt;li&gt;Quando você inicia o aplicativo, o método OnStartup da classe App é chamado. É aqui que você pode configurar serviços, definir a página inicial e realizar outras tarefas de inicialização.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gerenciamento do Ciclo de Vida:

&lt;ul&gt;
&lt;li&gt;A classe App também gerencia o ciclo de vida do aplicativo. Ela responde a eventos como &lt;strong&gt;OnStart&lt;/strong&gt;, &lt;strong&gt;OnSleep **e **OnResume&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OnStart&lt;/strong&gt;: Chamado quando o aplicativo é iniciado. Aqui, você pode configurar recursos iniciais e preparar o aplicativo para uso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OnSleep&lt;/strong&gt;: Chamado quando o aplicativo entra em segundo plano (por exemplo, quando o usuário muda para outro aplicativo). Você pode salvar o estado do aplicativo aqui.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OnResume&lt;/strong&gt;: Chamado quando o aplicativo volta ao primeiro plano. Use isso para restaurar o estado do aplicativo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configuração de Páginas e Navegação:

&lt;ul&gt;
&lt;li&gt;A classe App define a página inicial do aplicativo usando o método MainPage. Você pode atribuir uma instância de uma página (como ContentPage ou NavigationPage) a essa propriedade.&lt;/li&gt;
&lt;li&gt;Além disso, você pode configurar a navegação entre páginas no método OnStart. Por exemplo, você pode definir uma página de login como a primeira página e, após o login, navegar para a página principal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Recursos Globais:

&lt;ul&gt;
&lt;li&gt;A classe App é um ótimo lugar para definir recursos globais, como estilos, temas ou serviços compartilhados.
Você pode usar o método OnAppThemeChanged para lidar com alterações de tema (claro/escuro) em todo o aplicativo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Para que serve a AppShell.xaml?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nesse arquivos estaremos lidando com navegação através de diferentes tipos de layout. Em geral, é onde voce define seus menus, se serão Flyout ou TabBar, ou até mesmo os dois. Usamos esse arquivos se desejamos usar a navegação via &lt;a href="https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/shell/?view=net-maui-8.0" rel="noopener noreferrer"&gt;Shell&lt;/a&gt;, porém podemos descartá-lo e usar a navegação vanilla &lt;a href="https://learn.microsoft.com/en-us/dotnet/maui/user-interface/pages/navigationpage?view=net-maui-8.0" rel="noopener noreferrer"&gt;via NavigationPage&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Para que serve o arquivo MauiProgram.cs?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assim como o arquivo Program.cs em AspNet Core, esse arquivo é o ponto de entrada para o seu app, é a primeira coisa a ser executada quando o usuário abre seu app.&lt;/li&gt;
&lt;li&gt;Aqui podemos configurar fontes, container de injeção de dependências, serviços e biblioteca de terceiros.&lt;/li&gt;
&lt;li&gt;Em resumo, é onde começa tudo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Vamos Respirar um pouco antes de prosseguir
&lt;/h2&gt;

&lt;p&gt;E assim finalizo essa primeira parte com muita explicação sobre o que vamos ver nos próximos artigos. Muito obrigado por ter chegado até aqui, dúvidas, sugestões e correções fique a vontade em deixar nos comentários, nos vemos no próximo artigo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MarcosCostaDev/Maui-por-onde-comecar/tree/0b31593022f8f070246f4628d3668055c008786c" rel="noopener noreferrer"&gt;Repositório no Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deixo esse vídeo para motivar vocês a ler esse artigo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://www.youtube.com/watch?si=1cE2InP9FzsY9qEF&amp;amp;%3Bt=168&amp;amp;v=TRPBY_lxJfE&amp;amp;feature=youtu.be" rel="noopener noreferrer"&gt;
      youtube.com
    &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;Até a próxima! 👋&lt;/p&gt;

</description>
      <category>maui</category>
      <category>dotnet</category>
      <category>android</category>
      <category>ios</category>
    </item>
    <item>
      <title>Como conectar o Aplicativo MAUI no Emulador Android e WEB Api na mesma máquina</title>
      <dc:creator>Marcos Costa</dc:creator>
      <pubDate>Sat, 14 Oct 2023 19:59:11 +0000</pubDate>
      <link>https://dev.to/marcoscostadev/como-conectar-o-aplicativo-maui-no-emulador-android-e-web-api-na-mesma-maquina-4pd3</link>
      <guid>https://dev.to/marcoscostadev/como-conectar-o-aplicativo-maui-no-emulador-android-e-web-api-na-mesma-maquina-4pd3</guid>
      <description>&lt;p&gt;Olá devs, vocês que já estiveram na situação de precisar atualizar o backend direto no servidor para fazer com uma atualização especifica de comportamento de endpoint? E se eu te mostrar que você não precisa fazer isso no seu dia a dia caso você tenha na mesma solução (ou até em diferentes) o aplicativo MAUI e a WEB API? Então, aqui vamos nós. Detalhe: essa dica funciona até para Blazor-MAUI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maquina Virtual e Hospedeira (Host)
&lt;/h2&gt;

&lt;p&gt;Primeiro, vamos entender como funciona de forma simplificadíssima uma maquina virtual e o sistema hospedeiro (Host). Nós temos aqui duas entidades, a maquina &lt;strong&gt;HOST&lt;/strong&gt; que é basicamente o seu computador, e a maquina virtual, que nesse caso é a maquina que se comunicará com os recursos de hardware do Host via software. O Emulador Android é simplesmente uma maquina virtual que está consumindo recursos de hardware do HOST via software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos de redes Emulador Android
&lt;/h2&gt;

&lt;p&gt;Agora, precisamos entender como funciona os recursos de rede do emulador android que está rodando na sua maquina. Como Apresentado na &lt;a href="https://developer.android.com/studio/run/emulator-networking"&gt;documentação oficial do Google&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network Address&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.1&lt;/td&gt;
&lt;td&gt;Router or gateway address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.2&lt;/td&gt;
&lt;td&gt;Special alias to your host loopback interface (127.0.0.1 on your development machine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.3&lt;/td&gt;
&lt;td&gt;First DNS server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.4 / 10.0.2.5 / 10.0.2.6&lt;/td&gt;
&lt;td&gt;Optional second, third, and fourth DNS servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.15&lt;/td&gt;
&lt;td&gt;The emulated device network or ethernet interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;127.0.0.1&lt;/td&gt;
&lt;td&gt;The emulated device loopback interface&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O que nos interessa aqui endereço especial &lt;code&gt;10.0.2.2&lt;/code&gt;, eles nos permite se comunicar diretamente com o endereço &lt;code&gt;127.0.0.1&lt;/code&gt; da maquina HOST (O famoso e famigerado &lt;code&gt;localhost&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Desenvolvendo para ASPNET e acessando no emulador
&lt;/h2&gt;

&lt;p&gt;Como bem sabemos, quando iniciamos um &lt;a href="https://learn.microsoft.com/pt-br/aspnet/core/getting-started/?view=aspnetcore-7.0&amp;amp;tabs=windows"&gt;aplicativo web para AspNet Core&lt;/a&gt;, ele sempre rodará na nossa &lt;strong&gt;localhost (127.0.0.1)&lt;/strong&gt;. Agora tá fácil né, quando você quiser acessar localhost da sua maquina direto do emulador é só usar o &lt;code&gt;10.0.2.2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Criei um simples projeto padrão de web api&lt;/p&gt;

&lt;p&gt;![Exemplo de um aplicativo aspnet core rodando na maquina host com o endereço &lt;a href="https://localhost:7270"&gt;https://localhost:7270&lt;/a&gt;. Aqui temos apenas uma mensagem de boas vindas que diz 'Bem vindo'](&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7i4vgwxsgke13hp2yf79.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7i4vgwxsgke13hp2yf79.png" alt="Image description" width="517" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos acessar o mesmo endereço do meu host no navegador chrome do Emulador Android, observe que eu usei o endereço &lt;code&gt;https://10.0.2.2:7270&lt;/code&gt; que corresponde ao meu &lt;code&gt;https://localhost:7270&lt;/code&gt; da minha maquina host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z0vuw0wg2bjk02s7944.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z0vuw0wg2bjk02s7944.png" alt="Emulador com o chrome aberto no endereço https://10.0.2.2:7270, porém com erro de certificado, na tela tem um desenho de atenção com a mensagem escrita 'Your Connection is not private' com o botão 'Advanced' em baixo" width="447" height="945"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que ao acessar esse endereço, você verá um erro de 'Your Connection is not private', isso acontece porque eu estou rodando na minha maquina host uma aplicação que usa &lt;em&gt;https&lt;/em&gt; e o seu ceritificado não é compartilhado com o emulador. Então, para não adentrar muito nesse mundo do SSL e HTTPS, vamos somente ignorar essa parte clicando em &lt;code&gt;Advanced&lt;/code&gt; e depois em &lt;code&gt;Proceed to 10.0.2.2 (unsafe)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gpsiyrw6496p77fwwt4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gpsiyrw6496p77fwwt4.png" alt="Navegador no endereço 10.0.2.2:7270, onde mostra a mensagem Proceed to 10.0.2.2 (unsafe) onde o usuário deve clicar" width="451" height="946"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após clicar em &lt;code&gt;Proceed to 10.0.2.2 (unsafe)&lt;/code&gt;, nossa imagem é finalmente exibida. Então voilá, você tem o seu emulador acessando o seu endereço de api direto da web api rodando no host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2nhcb06hne54boma4fgc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2nhcb06hne54boma4fgc.png" alt="Emulador acessando o endereço 10.0.2.2:7270 que exibe uma mensagem " width="455" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos para a próxima etapa&lt;/p&gt;
&lt;h2&gt;
  
  
  Executando os dois projetos simuntaneamente pelo visual studio
&lt;/h2&gt;

&lt;p&gt;Essa etapa é bem simples, precisamos apenas configurar a solução para executar os dois projetos simuntaneamente. Tenha em mente que você precisa está rodando o seu aplicativo android no emulador. Primeiro vamos definir que quando rodar a solução, o projeto que será iniciado é o projeto &lt;strong&gt;MAUI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos fazer essa pequena configuração.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecione o projeto do &lt;strong&gt;MAUI&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Botão direito do Mouse em cima desse projeto&lt;/li&gt;
&lt;li&gt;Então selecione a opção "Set as Startup Project"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe7yfo1kqpb0d48ny9i1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe7yfo1kqpb0d48ny9i1w.png" alt="bortão direito no projeto do MAUI e selecione a optão " width="461" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora selecione o emulador que você irá executar o MAUI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clique na setinha ao lado do botão de executar&lt;/li&gt;
&lt;li&gt;Selecione Android Emulators&lt;/li&gt;
&lt;li&gt;Selecione o seu emulador&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcui3fmw9bylwwasqvd8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcui3fmw9bylwwasqvd8j.png" alt="Selecionando o emulador mostrando exatamente os textos acima" width="627" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos ajustar a solução para executar o Projeto de API e Projeto do MAUI para executarem simuntaneamente &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Botão direito na solução&lt;/li&gt;
&lt;li&gt;Selecione &lt;code&gt;Properties&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Selecione a opção &lt;code&gt;Multiple startup projects&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Marque os dois projetos com a action &lt;code&gt;Start&lt;/code&gt; como na imagem abaixo&lt;/li&gt;
&lt;li&gt;Clique no botão &lt;code&gt;OK&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffiwg7i8zcvbr9r6ftgly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffiwg7i8zcvbr9r6ftgly.png" alt="Mostrando as propriedades da solution, marcando o checkbox " start="" width="780" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao fazer isso, já temos nossa configuração ideal para o nosso proximo passo. Observe que o botão de executar do visual studio mudou para somente &lt;code&gt;Start&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Adicionando a chamada do servidor no Android
&lt;/h2&gt;

&lt;p&gt;aqui vamos adicionar alguns trexos de códigos bem simples no nosso aquivo &lt;code&gt;MainPage.xaml&lt;/code&gt; e &lt;code&gt;MainPage.xaml.cs&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MainPage.xaml
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ContentPage&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ScrollView&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;VerticalStackLayout&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span class="c"&gt;&amp;lt;!-- Adicione esse botão ao final do layout, mas antes do &amp;lt;/VerticalStackLayout&amp;gt;&amp;lt;/ScrollView&amp;gt;&amp;lt;/ContentPage&amp;gt;  --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt;
                &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"ShowWelcomeButton"&lt;/span&gt;
                &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Show welcome message"&lt;/span&gt;
                &lt;span class="na"&gt;SemanticProperties.Hint=&lt;/span&gt;&lt;span class="s"&gt;"show exacly the message welcome from the ApI"&lt;/span&gt;
                &lt;span class="na"&gt;Clicked=&lt;/span&gt;&lt;span class="s"&gt;"ShowWelcomeButton_Clicked"&lt;/span&gt;
                &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- somente o botão acima --&amp;gt;&lt;/span&gt;
...
        &lt;span class="nt"&gt;&amp;lt;/VerticalStackLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ScrollView&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContentPage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;MainPage.xaml.cs
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Agora vamos adicionar essa implementação */&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ShowWelcomeButton_Clicked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// cria um httpclient que ja conecta com a nossa api &lt;/span&gt;
&lt;span class="c1"&gt;// usando o endereço https://10.0.2.2:7270&lt;/span&gt;
                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;httpClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;BaseAddress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://10.0.2.2:7270"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// chama o endpoint inicial "/"&lt;/span&gt;
                &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetStringAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

                &lt;span class="n"&gt;ShowWelcomeButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Message From Server: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
               &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;DisplayAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ok"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Seu App deve rodar no emulador como na imagem abaixo.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhttssmuyk4jiq22kyuy5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhttssmuyk4jiq22kyuy5.png" alt="emulador android com os botão " width="456" height="997"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora é só clicar no botão "Show welcome message" e... &lt;strong&gt;ERROR?!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvwd16xu5rpvt0qdh812.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvwd16xu5rpvt0qdh812.png" alt="Alerta mostrando " width="451" height="970"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse erro ocorreu devido a um erro de certificado, lembra daquele erro do chrome que ele estava dando em relação ao certificado inválido, a página não era segura e precisaríamos "forçar" o acesso a ela. Então, aqui no app android acontece a mesma coisa. Então vamos mexer em algumas configurações do nosso aplicativo Android e API.&lt;/p&gt;
&lt;h2&gt;
  
  
  Resolvendo o java.security.cert.CertPathValidatorException
&lt;/h2&gt;

&lt;p&gt;Como dito antes, esse erro de certificado ocorre devido ao acesso a um endereço https onde o certificado não é encontrado ou não é válido. Então nesse momento precisaremos configurar a API para não exigir o certificado quando estivemos trabalhando em desenvolvimento. Para isso precisaremos ajustar o arquivo &lt;code&gt;program.cs&lt;/code&gt; da nossa API. Para isso basta verificar se o ambiente que estamos desenvolvendo é o desenvolvimento e então desativar o redirecionamento para o https.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;program.cs (WebApiExample)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Configure the HTTP request pipeline.&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsDevelopment&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseHttpsRedirection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Precisamos também mudar a maneira que nossa Api irá rodar, então selecione nossa API como projeto a ser incializado &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;botão direito na API (WebApiExample)&lt;/li&gt;
&lt;li&gt;Selecione Set as Startup Project&lt;/li&gt;
&lt;li&gt;Mude na seleção de start para o 'http'. &lt;/li&gt;
&lt;li&gt;Pronto, agora nossa API estará rodando na &lt;code&gt;http://localhost:5017/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então na sua mente deve está passando "Ah, agora é so mudar o endereço para http e rodar o projeto!" (lembresse de reconfigurar para rodar os dois Apps juntos)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;httpClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;BaseAddress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://10.0.2.2:5017"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e então... &lt;strong&gt;ERROR?!&lt;/strong&gt; &lt;code&gt;Cleartext HTTP traffic to 10.0.2.2 not permitted&lt;/code&gt;. Simplesmente o Android não permite acessar endereços HTTP por &lt;strong&gt;padrão&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtslvpxk7sr9pdvmnrd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtslvpxk7sr9pdvmnrd5.png" alt="Mostrando um alerta onde exibe a mensagem no emulador android " width="452" height="952"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não se desespere, temos a solução para isso logo a seguir&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolvendo o Cleartext HTTP traffic to 10.0.2.2 not permitted
&lt;/h2&gt;

&lt;p&gt;A gente precisa contornar esse erro atraves da classe &lt;code&gt;MainApplication.cs, precisaremos adicionar a propriedade&lt;/code&gt;Debuggable&lt;code&gt;e&lt;/code&gt;UsesCleartextTraffic`. dessa maneira conseguiremos contornar a verificação https. Então acesse o arquivo "Platforms/Android/MainApplication.cs"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymil8aggkggdkk63a0tr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymil8aggkggdkk63a0tr.png" alt="Exibindo as pastas da solução com o endereço " width="365" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adicione as propriedades &lt;code&gt;Debuggable&lt;/code&gt; e &lt;code&gt;UsesCleartextTraffic&lt;/code&gt; no atributo &lt;code&gt;[Application]&lt;/code&gt; ele deverá ficar assim:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Application(Debuggable = true, UsesCleartextTraffic = true)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e assim ficará o código da &lt;code&gt;MainApplication.cs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
    [Application(Debuggable = true, UsesCleartextTraffic = true)]&lt;br&gt;
    public class MainApplication : MauiApplication&lt;br&gt;
    {&lt;br&gt;
        public MainApplication(IntPtr handle, JniHandleOwnership ownership)&lt;br&gt;
            : base(handle, ownership)&lt;br&gt;
        {&lt;br&gt;
        }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    protected override MauiApp CreateMauiApp() =&amp;gt; MauiProgram.CreateMauiApp();
   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ao executar novamente... SEM ERROS! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft32xzh2nfsah7h1rufrf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft32xzh2nfsah7h1rufrf.png" alt="Exibindo o emulador android com o botão funcionando mostrando a mensagem " width="464" height="959"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações finais e sugestões
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Publicação em produção
&lt;/h3&gt;

&lt;p&gt;Quando estiver executando o aplicativo em desenvolvimento, faz sentido você definir esse atributo &lt;code&gt;[Application(Debuggable = true, UsesCleartextTraffic = true)]&lt;/code&gt; na classe &lt;code&gt;MainApplication.cs&lt;/code&gt;. Porém, o ideal é seu app não ser publicado na loja com isso, e for, provavelmente vai ser rejeitado por essa falha de segurança que você deixou. Para evitar isso, a gente pode usar as variaveis de Build &lt;code&gt;DEBUG&lt;/code&gt; onde você consegue definir o codigo que irá somente executado quando você estiver rodando pelo visual studio ou somente rodando na maquina de desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#if DEBUG
  [Application(Debuggable = true, UsesCleartextTraffic = true)]
#else
  [Application]
#endif
  public class MainApplication : MauiApplication
{
    public MainApplication(IntPtr handle, JniHandleOwnership ownership)
        : base(handle, ownership)
    {
    }

    protected override MauiApp CreateMauiApp() =&amp;gt; MauiProgram.CreateMauiApp();
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  E rodando para o windows?
&lt;/h3&gt;

&lt;p&gt;O endereço de api que voce colocou na sua HttpClient so faz sentido  para rodar no android. Porém, MAUI é multiplataforma. Felizmente MAUI também trás outras variaveis de build que identificam a plataforma que o App esta executando. Então usaremos a &lt;code&gt;ANDROID&lt;/code&gt; para esse caso. Ou seja, sempre que estivemos executando no Android um trexo de código espefico irá executar&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;csharp&lt;br&gt;
                using var httpClient = new HttpClient()&lt;br&gt;
                {&lt;br&gt;
                #if ANDROID&lt;br&gt;
                    BaseAddress = new Uri("http://10.0.2.2:5017")&lt;br&gt;
                #else&lt;br&gt;
                    BaseAddress = new Uri("http://localhost:5017")&lt;br&gt;
                #endif&lt;br&gt;
                };&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Obrigado!
&lt;/h2&gt;

&lt;p&gt;Obrigado por ter chegado até aqui. Aqui está o código fonte dessas &lt;a href="https://github.com/MarcosCostaDev/ConnectMAUI-WebApi"&gt;aplicação no Github&lt;/a&gt;. Commente aqui se você tiver dúvidas ou quiser compartilhar informações sobre o desenvolvimento no MAUI!&lt;/p&gt;

</description>
      <category>maui</category>
      <category>dotnet</category>
      <category>mobile</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Criando uma console application com esteróides com o pacote System.CommandLine</title>
      <dc:creator>Marcos Costa</dc:creator>
      <pubDate>Mon, 18 Sep 2023 03:31:39 +0000</pubDate>
      <link>https://dev.to/marcoscostadev/criando-uma-console-application-com-esteroides-com-o-pacote-systemcommandline-9fp</link>
      <guid>https://dev.to/marcoscostadev/criando-uma-console-application-com-esteroides-com-o-pacote-systemcommandline-9fp</guid>
      <description>&lt;p&gt;Olá devs! Já se pergutaram como os devs criam consoles application bem pomposas como essas do dotnet, cheias de comandos e listagem do que elas fazem? &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh8f6jd5a5e456w23fvf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh8f6jd5a5e456w23fvf.png" alt="dotnet console application" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então vamos lá começar com o feijão com arroz e criar uma &lt;code&gt;console application&lt;/code&gt; no visual studio, ou se você prefirir, dá para usar o command line do &lt;code&gt;dotnet&lt;/code&gt; para isso. Meus exemplos serão no &lt;strong&gt;Visual studio 2022 Community&lt;/strong&gt;, mas você pode usar até um bloco de notas com a &lt;code&gt;dotnet tool&lt;/code&gt; que funcionará.&lt;/p&gt;
&lt;h2&gt;
  
  
  Criando a console aplication
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;crie um novo projeto do tipo console application.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymr8rfdjwi6z14d4zomy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymr8rfdjwi6z14d4zomy.png" alt="Criando um novo projeto console no visual studio 2022" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Após sua criação, importe o pacote nuget &lt;code&gt;System.CommandLine&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyalhv1xf0sqhm9hzx75w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyalhv1xf0sqhm9hzx75w.png" alt="Botão direito do mouse em dependencias do projeto, selecionando Manager Nuget Package" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na barra de procura, procure por &lt;code&gt;System.CommandLine&lt;/code&gt;, mas não se esqueça de marcar a opção &lt;code&gt;include prerelease&lt;/code&gt;. E então click em &lt;strong&gt;install&lt;/strong&gt; para instalar a dependência no seu projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3p1al3z0y16x6n3rzl4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3p1al3z0y16x6n3rzl4o.png" alt="Busca por System.CommandLine e selecionando include prerelease" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agora substitua o código inicial da sua &lt;code&gt;Program.cs&lt;/code&gt; pelo codigo abaixo:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.CommandLine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Crie uma descrição que será exibida caso o usuario não passe nenhum argumento.&lt;/span&gt;
&lt;span class="c1"&gt;// Isso também serve para você escrever uma descrição da sua ferramenta console.&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"
Bem vindo ao meu console charmosão com vários 
comandos listados e documentados"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rootCommand&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RootCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Criando um argumento a ser aceito por nosso app&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mensagemArg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Argument&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Uma Mensagem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Apenas essa mensagem será exibida"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// adicionando esse argumento no nosso comando principal&lt;/span&gt;
&lt;span class="n"&gt;rootCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddArgument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensagemArg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Definindo uma ação para quando esse comando for adicionado.&lt;/span&gt;
&lt;span class="n"&gt;rootCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetHandler&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;mensagemArgValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensagemArgValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//Apenas exibe a mensagem recebida&lt;/span&gt;

&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;mensagemArg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Passe os argumentos recebidos pela a console aplication para o objeto rootCommand &lt;/span&gt;
&lt;span class="c1"&gt;// através do seu metódo invoke.&lt;/span&gt;
&lt;span class="n"&gt;rootCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora execute a sua aplicação console &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlq6ddhykcaz3fm2k5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlq6ddhykcaz3fm2k5o.png" alt="Clique em executar" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;e voilá, temos nossa aplicação rodando com a descrição que colocamos&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6r8niduf5dwcbialllo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk6r8niduf5dwcbialllo.png" alt="Exibição do menu do console application" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  A keyword &lt;code&gt;args&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Uma pequena explicação sobre a keyword &lt;code&gt;args&lt;/code&gt; que passada como parametro na &lt;code&gt;rootCommand.Invoke(args);&lt;/code&gt;: Todo console application pode aceitar argumentos como parametro inicial, dentro do &lt;code&gt;C#&lt;/code&gt; ela é recebida através de uma array de strings, esse array de string é identificado quando você executa um comando separando as palavras por espaço.&lt;/p&gt;
&lt;h2&gt;
  
  
  Adicionando nossos primeiros argumentos
&lt;/h2&gt;

&lt;p&gt;Essa lib é bem poderosa e conseguimos até mesmo definir quais argumentos são esperados e a ordem que eles devem acontecer, como você pode ver no código abaixo, onde definimos que o primeiro argumento recebido será uma string&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Criando um argumento a ser aceito por nosso app&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mensagemArg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Argument&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Uma Mensagem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Apenas essa mensagem será exibida"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// adicionando esse argumento no nosso comando principal&lt;/span&gt;
&lt;span class="n"&gt;rootCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddArgument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensagemArg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Definindo uma ação para quando esse comando for adicionado.&lt;/span&gt;
&lt;span class="n"&gt;rootCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetHandler&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;mensagemArgValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensagemArgValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//Apenas exibe a mensagem recebida&lt;/span&gt;

&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;mensagemArg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas também podemos mudar para dizer que receberemos um inteiro (&lt;code&gt;int&lt;/code&gt;), um double (&lt;code&gt;double&lt;/code&gt;), um arquivo (&lt;code&gt;FileInfo&lt;/code&gt;), um diretório (&lt;code&gt;DirectoryInfo&lt;/code&gt;) e &lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/commandline/model-binding"&gt;varios outros tipos&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opções para comandos
&lt;/h2&gt;

&lt;p&gt;Também é possível fazer ações como o comando &lt;/p&gt;

&lt;p&gt;&lt;code&gt;dotnet restore [project.csproj/solution.sln] --build release&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vamos criar algo semelhante a isso nesse nosso &lt;code&gt;ConsoleCharmosao&lt;/code&gt;, onde teremos um novo comando chamado &lt;code&gt;length&lt;/code&gt; que receberá uma string e retornará a quantidade de caracteres contida nela.&lt;br&gt;
Teremos que mudar nosso  Código para chear proximo disso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.CommandLine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Crie uma descrição que será exibida caso o usuario não passe nenhum argumento.&lt;/span&gt;
&lt;span class="c1"&gt;// Isso também serve para você escrever uma descrição da sua ferramenta console.&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"
Bem vindo ao meu console charmosão com vários 
comandos listados e documentados"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rootCommand&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RootCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Crie um novo comando&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;lengthCommand&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"length"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Quantidade de caracteres em uma string"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// define nomes alternativos para chamar esse comando&lt;/span&gt;
&lt;span class="n"&gt;lengthCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAlias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"len"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;lengthCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAlias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"l"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// crie novo argumento a &lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;lengthArgument&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Argument&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"string para ser processada"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;lengthArgument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetDefaultValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// adicione o novo argumento ao comando&lt;/span&gt;
&lt;span class="n"&gt;lengthCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddArgument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lengthArgument&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// crie uma nova opção&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;lengthOptionRepeat&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Option&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"--repeat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Imprime quantas vezes?"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;lengthOptionRepeat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAlias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-r"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;lengthOptionRepeat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetDefaultValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// adicione essa opção ao lengthComand&lt;/span&gt;
&lt;span class="n"&gt;lengthCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lengthOptionRepeat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;lengthCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetHandler&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;lengthArgumentValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lengthOptionRepeatValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// recendo os valores e processando-os&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lengthOptionRepeatValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lengthArgumentValue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;lengthArgument&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lengthOptionRepeat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// lembre-se de passar os parametros aqui&lt;/span&gt;


&lt;span class="c1"&gt;// adicionando o length command ao nosso comando principal&lt;/span&gt;
&lt;span class="n"&gt;rootCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lengthCommand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Passe os argumentos recebidos pela a console aplication para o objeto rootCommand &lt;/span&gt;
&lt;span class="c1"&gt;// através do seu metódo invoke.&lt;/span&gt;
&lt;span class="n"&gt;rootCommand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Olha só como ficou nosso console após adição desse comando e option na sessão &lt;code&gt;Commands&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73h2pfwbt4pop66fhvlh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73h2pfwbt4pop66fhvlh.png" alt="Listagem de comandos e execuções" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Como testar?
&lt;/h3&gt;

&lt;p&gt;Para testar dentro do &lt;strong&gt;visual studio 2022&lt;/strong&gt; é possivel definir &lt;code&gt;lauchSettings.json&lt;/code&gt; onde eu defini abaixo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profiles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ConsoleCharmosao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"commandName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Project"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"StringLength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"commandName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"commandLineArgs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"length &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;minha string&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; --repeat 3"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqw7znhzb85gez8d4yky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqw7znhzb85gez8d4yky.png" alt="lauchSettings.json" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso, o &lt;code&gt;lauchSettings.json&lt;/code&gt; não esteja aprecendo para você, execute as ações abaixo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clique nas opções de execução (setinha para baixo), depois click em debug properties
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6hevxf6t20c6x90d8en.png" alt="Indo pra debug properties" width="674" height="337"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na janela que abriu, selecione o botão de adicionar configuração, e selecione projeto. Após isso, você pode adicionar o comando que deseja executar na hora de rodar o aplicativo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7gwc3s39vo1w0s5wwclh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7gwc3s39vo1w0s5wwclh.png" alt="Novo comando StringLength adicionado" width="462" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora você capaz de rodar e debugar seu comando direto do visual studio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy e execução
&lt;/h2&gt;

&lt;p&gt;Quando você definir suas configurações de publicação, lembresse de definir o &lt;code&gt;deployment mode&lt;/code&gt; como &lt;code&gt;Self-contained&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cxrfere32e6m4k395yq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cxrfere32e6m4k395yq.png" alt="Publish profile" width="687" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o &lt;code&gt;.exe&lt;/code&gt; publicado, você poderá rodar comandos como &lt;code&gt;ConsoleCharmosao.exe length "minha string" --repeat 3&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Obrigado!
&lt;/h2&gt;

&lt;p&gt;De agora em diante você sabe fazer um console cheio de firulas e comandos utéis e assim ajudar no DX e UX de suas futuras ferramentas. Qualquer duvida deixa nos comentarios, você pode acessar o &lt;a href="https://github.com/MarcosCostaDev/ConsoleCharmosao"&gt;código fonte aqui&lt;/a&gt;, Me siga no &lt;a href="https://github.com/MarcosCostaDev"&gt;Github&lt;/a&gt; e no &lt;a href="https://twitter.com/MarcosCostaDev"&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>dotnetcore</category>
      <category>dotnetframework</category>
      <category>consoleapplication</category>
    </item>
  </channel>
</rss>
