Mostrar mensagens com a etiqueta C#. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta C#. Mostrar todas as mensagens

terça-feira, 16 de abril de 2024

Aprenda a Evitar Memory Leaks no .NET com Dispose e Blocos Using



Os memory leaks são como fantasmas assombrando os desenvolvedores de software. Eles podem se esconder silenciosamente em nossos códigos, consumindo recursos preciosos e prejudicando o desempenho do aplicativo. No ambiente .NET, a gestão de memória é parcialmente automatizada pelo coletor de lixo (garbage collector), mas mesmo assim, é responsabilidade do desenvolvedor garantir a liberação adequada de recursos não gerenciados. Felizmente, o .NET oferece algumas ferramentas poderosas para lidar com isso, como o método Dispose() e os blocos using.

O Que São Memory Leaks?

Um memory leak ocorre quando um programa aloca memória dinamicamente repetidamente, mas não libera essa memória quando não é mais necessária. Isso pode acontecer por várias razões, mas é especialmente comum quando trabalhamos com recursos não gerenciados, como arquivos, conexões de banco de dados e objetos COM.

A Importância do Método Dispose()

O método Dispose() é uma parte fundamental do padrão de design "Dispose pattern" no .NET. Ele é usado para liberar explicitamente os recursos não gerenciados usados por um objeto. Ao implementar a interface IDisposable e chamar o método Dispose(), os desenvolvedores podem garantir que os recursos sejam liberados assim que não forem mais necessários.

Usando Blocos Using para Garantir a Liberação de Recursos

Os blocos using no C# fornecem uma maneira conveniente de garantir que os objetos que implementam IDisposable sejam liberados corretamente, mesmo se ocorrerem exceções no código. Um bloco using garante que o método Dispose() seja chamado automaticamente quando o escopo do bloco é concluído.

 

Exemplo Prático

Vamos examinar um trecho de código e explorar como podemos melhorá-lo para garantir uma gestão mais robusta de recursos no ambiente .NET.



No código acima, estamos lidando com uma operação de leitura de dados de um banco SQLite e exibindo-os em um DataGridView. Pode ser que vocês já estejas  familiarizado com códificação parecida. No entanto, há alguns problemas de gestão de recursos que precisamos resolver:

1. Gestão de Conexão com o Banco de Dados

O objeto SQLiteConnection precisa ser aberto e fechado corretamente para evitar vazamentos de recursos. Vamos usar um bloco using para garantir que a conexão seja fechada automaticamente quando não for mais necessária.



2. Limpeza de Recursos em Caso de Exceção

Se ocorrer uma exceção durante a execução do código dentro do bloco using, precisamos garantir que os recursos sejam liberados corretamente. Vamos mover a definição do objeto DataTable para dentro do bloco using e usar o método Dispose() para liberar o leitor e o comando em caso de exceção.



Conclusão

Lidar com memory leaks no .NET é crucial para manter a estabilidade e o desempenho dos aplicativos. Utilizar corretamente o método Dispose() e os blocos using é uma prática recomendada para garantir a liberação adequada de recursos não gerenciados. Ao melhorar a gestão de recursos em nosso código, garantimos que ele seja mais robusto, eficiente e menos propenso a problemas como memory leaks. Utilizando blocos using para objetos que implementam IDisposable, lidamos adequadamente com a liberação de recursos. Ao seguir essas práticas, podemos criar aplicativos mais estáveis e de alta qualidade no ambiente .NET. Adotar essas práticas desde o início do desenvolvimento, os desenvolvedores podem evitar muitas dores de cabeça no futuro e garantir uma experiência de usuário mais suave.

  

quarta-feira, 18 de maio de 2022

Como obter a PublicKeyToken de uma biblioteca ou assembly?



Olá pessoal, hoje quero te ajudar a encontrar a PublicKeyToken ou Token de Chave Pública de um aplicativo, assembly ou dll através da linha de comando do power shall.

Mas antes disso vamos definir o que é uma PublickKeyToken.

O que é PublicKeyToken?

PublickKeyToken ou token de chave pública é um hash de 64 bits da chave pública que corresponde à chave privada usada para assinar o assembly. Ele é usado para tornar um nome de assembly único.
Por exemplo, temos dois assemblies fortemente nomeados com os mesmos nomes de arquivos, o .NET os tratará como assemblies diferentes porque o token de cada é único.

Vamos a prática

Para obter a PublicKeyToken é muito simples, basta seguir os seguintes passos:

1- Pressione Windows + R e digita powershell em seguida clica em OK

2- Assim que abrir o powerShell, escreva a expressão abaixo:

([system.reflection.assembly]::loadfile("C:\projects\demo20\Intelligencia.UrlRewriter.dll")).FullName

Dentro da função loadfile coloca o como parametro o caminho completo da tua dll.
E terás uma resultado parecido com esse:

Intelligencia.UrlRewriter, Version=2.0.0.9, Culture=neutral, PublicKeyToken=0573f3650687980d

















Bonús - Como obter a PublicKeyToken via código C#?

Dé uma olhada neste link, se tiveres alguma dúvida podes deixar nos comentários.
https://docs.microsoft.com/en-us/dotnet/api/system.applicationid?view=net-6.0


Espero ter ajudado, forte abraço!







quinta-feira, 30 de maio de 2019

Como humanizar o formato dos DateTime em C#


Datas humanizadas são mais fáceis de ler. Eles estão bem formatados. Podemos mostrar "1 hora atrás" ou "1 minuto atrás", em vez do formato padrão, confuso. Hoje quero apresentar apenas um algoritmos que nos ajudarás a obter esse resultado em c#.

O Algoritmo


public static string GetDataHumanizada(DateTime d)
        {

            // Obtém o intervalo de tempo decorrido até a data actual.
            TimeSpan s = DateTime.Now.Subtract(d);

            int diasTotal = (int)s.TotalDays;
            int segundosTotal = (int)s.TotalSeconds;

            // Se o total de dias for superior à 31 dias ou inferior a zero
            // retornamos a data inserida no argumento.
            if (diasTotal < 0 || diasTotal >= 31)
            {
                return d.ToShortDateString();
            }

            if (diasTotal == 0)
            {
                // Menor que 1 minuto
                if (segundosTotal < 60)
                {
                    return "Agora mesmo";
                }
                // Menor que 2 minutos
                if (segundosTotal < 120)
                {
                    return "1 minuto atrás";
                }
                // Menor que 1 hora
                if (segundosTotal < 3600)
                {
                    return string.Format("{0} minutos atrás",
                        Math.Floor((double)segundosTotal / 60));
                }
                // Menor que 2 horas
                if (segundosTotal < 7200)
                {
                    return "1 hora atrás";
                }
                // Menor que 1 dia
                if (segundosTotal < 86400)
                {
                    return string.Format("{0} horas atrás",
                        Math.Floor((double )segundosTotal / 3600));
                }
            }
            // Completou um dia
            if (diasTotal == 1)
            {
                return "Ontem";
            }
            // Menor que 1 semana
            if (diasTotal < 7)
            {
                return string.Format("{0} dias atrás",
                    diasTotal);
            }
            // Menos que 1 mês
            if (diasTotal < 31)
            {
                return string.Format("{0} semanas atrás",
                    Math.Ceiling((double)diasTotal / 7));
            }
            return null;
        }

Como usar?


Deixa-me dar um exemplo rápido de como usar:

    static void Main()
    {

    DateTime dataPublicacao = new DateTime(2019, 5, 30,21,15,36);
     //Data de Publicacao é: 30/05/2019 21:15:36
        
        Console.WriteLine(GetDataHumanizada(dataPublicacao));
        Console.ReadKey();

        // Resultado: 4 minutos atrás  
        // Onde dada do sistema é: 30/05/2019 21:15:32        
    }

Conforme o nosso algoritmo está podemos humanizar a data apenas até semanas. Se queres um desafio, altere-o até meses ou mesmo até anos. Espero ter ajudado.
Um forte abraço.

sexta-feira, 21 de setembro de 2018

Por que você pode querer usar CGI com C#?

O que é o CGI?

O Common Gateway Interface, ou CGI, é um padrão W3C de longa data para comunicação entre uma página da web e um aplicativo disponível no servidor web. Os aplicativos no servidor que se comunicam no CGI têm todas as funcionalidades de qualquer outro aplicativo nativo, como acesso ao banco de dados ou leitura de arquivos de entrada. No entanto, no mundo atual, com ASP.NET, PHP, Perl e muitas outras linguagens de script que fornecem essencialmente a mesma funcionalidade, você pode se perguntar por que se incomodaria em criar seu próprio aplicativo CGI com C #. Existem algumas razões que posso pensar que podem ser aplicadas.

Motivo 1

Primeiro, os interpretadores para ASP, PHP, Perl, etc. são essencialmente aplicativos aproveitando o CGI. Em muitos casos, eles são criados diretamente no serviço da Web (como com ISAPI para IIS), mas todos eles também estão disponíveis em suas aparências CGI (ASP disponível como CGI por meio do projeto Mono da Novel). Para entender melhor os recursos e a limitação da sua linguagem de script favorita do servidor, você pode estar interessado em saber como ela funciona em um nível inferior.

Motivo 2

Outra razão é que você pode escrever seu próprio intérprete de mini-scripts. Linguagens como ASP são de propósito geral e, embora possam fazer qualquer coisa, algumas coisas poderiam ser melhor realizadas com um script de propósito mais específico.

Por exemplo, isso descreve a razão pela qual eu investiguei pela primeira vez o reino de CGI e C#. Minha empresa tem uma demanda muito alta por relatórios. Apesar de uma ampla gama de ferramentas disponíveis para os funcionários, o site continua sendo o principal recurso para seus relatórios personalizados devido a muitas viagens. Todos os relatórios têm uma variedade de requisitos gráficos muito exigentes, desde formatação, até gráficos, até o fornecimento de uma pasta de trabalho do Excel gerada dinamicamente. O código ASP estava começando a parecer assustador, então criamos um aplicativo C# personalizado para interpretar uma linguagem de relatório tão específica às necessidades de nossos negócios que até mesmo usuários avançados não programadores podem ajudar na criação e modificação das necessidades de relatórios. (Um tópico para outro artigo? diz que sim no comentário.)

Motivo 3

Outro benefício para CGI é que ele é agnóstico do servidor web. O mesmo executável funcionará para o IIS como para o Apache, como para qualquer outro servidor da Web compatível com o W3C. E, ao contrário de algumas linguagens de script, o executável é compilado para que a execução seja rápida e a origem não esteja visível.

C# é uma excelente linguagem para usar com CGI por causa do poder do .NET framework. Também é possível testar um aplicativo C# utilizando CGI, mesmo sem um servidor da Web, porque ele simplesmente é executado como um aplicativo de console. Mais sobre isso depois.

Motivo 4

Finalmente, existem provedores de serviços da Web que permitem usar aplicativos CGI personalizados que podem não permitir o uso de módulos Apache ou ISAPI IIS DLLs. O motivo é que um módulo integrado em um servidor da Web pode causar muito mais danos ao servidor da Web do que um executável separado e controlável.

Gostou? Comenta o que mais te interessou!


sexta-feira, 31 de agosto de 2018

Como exportar Crystal Report para PDF e Excel (código completo)

Vamos aprender, de forma rápida, como exportar um relatório de Crystal Report para os formatos PDF e Excel. Como exemplo vou pegar o projecto que fizemos no post anterior. Clica aqui para ver.

Adicione os botões "Exportar PDF" e "Exportar Excel" no formulário para exportar o relatório.



Para o botão "Exportar PDF" coloque o seguinte código:


private void btnExportToPDF_Click(object sender, EventArgs e)
{
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Filter = "Arquivo PDF|*.pdf";
            string nomeArquivo="";
            if(dialog.ShowDialog()== DialogResult.OK)
            {
                nomeArquivo = dialog.FileName;
            cr.ExportToDisk(ExportFormatType.PortableDocFormat, nomeArquivo);
            }
            
}

Para o botão "Exportar Excel" coloque o seguinte código:

private void btnExportToExcel_Click(object sender, EventArgs e)
{
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Filter = "Arquivo Excel|*.xls";
            string nomeArquivo = "";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                nomeArquivo = dialog.FileName;
            cr.ExportToDisk(ExportFormatType.Excel, nomeArquivo);
            }

}

Como podemos ver, para os dois botões, colocamos um SaveFileDialog para o utilizador poder escolher a pasta e o nome do arquivo.



Executa o programa e testa cada botão. Espero te ajudado.

Código completo deste projecto.


public partial class FormPaises : Form
    {
        public FormPaises()
        {
            InitializeComponent();
        }
        Reports.ReportPaises2 cr = new Reports.ReportPaises2();

        private List<Pais> GetListaPaises()
        {
            List<Pais> Paises = new List<Pais>
            {
                new Pais(1, "Angola"),
                new Pais(2, "Brasil"),
                new Pais(3, "Portugal"),
                new Pais(6, "Moçambique"),
                new Pais(7, "Cabo-Verde"),
                new Pais(8, "Namibia")
            };

            return Paises;
        }

        private void FormPaises_Load(object sender, EventArgs e)
        {
            crystalReportViewer1.ReportSource = cr;

            cr.SetDataSource(GetListaPaises());

        }

        private void btnExportToPDF_Click(object sender, EventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Filter = "Arquivo PDF|*.pdf";
            string nomeArquivo="";
            if(dialog.ShowDialog()== DialogResult.OK)
            {
                nomeArquivo = dialog.FileName;
            cr.ExportToDisk(ExportFormatType.PortableDocFormat, nomeArquivo);
            }
         

        }

        private void btnExportToExcel_Click(object sender, EventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Filter = "Arquivo Excel|*.xls";
            string nomeArquivo = "";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                nomeArquivo = dialog.FileName;
            cr.ExportToDisk(ExportFormatType.Excel, nomeArquivo);
            }


        }
    }

Como criar um relatório CrystalReport sem banco de dados


A um tempo tive problemas com as conexões do crystal report. Quando passava a aplicação para outros computadores tinha que trocar também a conexão, porem muitas vezes esquecia de fazer esse processo e ficava horas e horas para descobrir onde estava o problema. Por isso optei por usar os crystal report sem conexão directa a base de dados.

O que vamos ver é pequeno exemplo de como criar um relatório de Lista de Países com o Crystal Reports a partir de uma lista de objectos sem ter uma banco de dados.


Passo 1

Certifique-se de ter Crystal Report para o Visual Studio instalado.

Passo 2

Cria um novo projecto WinForm. Neste exemplo criei um projecto com nome TesteCrystalSemDB. A seguir, cria uma classe País como o seguinte:

public class Pais
    {
        public Pais(int codigo,string nome)
        {
            this.Codigo = codigo;
            this.NomePais = nome;
        }
        public int Codigo { get; set; }
        public string NomePais { get; set; }
    }

Passo 3


Adicione um novo formulário com o nome FormPaises, e adicione o seguinte método:

        private List<Pais> GetListaPaises()
        {
            List<Pais> Paises = new List<Pais>
            {
                new Pais(1, "Angola"),
                new Pais(2, "Brasil"),
                new Pais(3, "Portugal"),
                new Pais(6, "Moçambique"),
                new Pais(7, "Cabo-Verde"),
                new Pais(8, "Namibia")
            };

            return Paises;
        }

Passo 4

Adicione um DataSet. Nomeia-o por DataSet1 como na figura abaixo:



Dentro da DataSet adicione uma DataTable com o nome de Pais, e cria as colunas com os mesmos nome dos atributos da classe Pais. ( Esse é o maior segredo ;). Confirma na figura acima.

Passo 5


Adicione ao projecto um Crystal Report e nomeio-o por ReportPaises2, clique em Add.

 Aparecerá uma caixa como a que se segui, as  opeções criar um nome documento de crystal report, escolha a segunda, Relatório em Branco e clica OK.

Passo 6

Restamos definir a fonte de dados ou DataSet no nosso Crystal Report. Para isso, vai em Fiel Explorer dê um clique direito na Database Fiel para selecionar o opção Database Expert conforme a figura abaixo mostra:


No assistente, expande Dados de Projecto > Conjuntos de Dados ADO.NET > TesteCrystalSemDB.DataSet1e seleccione a DataTable Pais.


 Modele a aparência do relatório, e adicione os campos que deseja ao relatório, confirme na figura:

Passo 7


Volte para o formulário FormPaises, vai à ToolBox, escolha o CrystalReportViewer, coloque-o ao formulário e nomeia-o por crystalReportViewer1.

Selecione este novo componente e (1) no seu canto superior direito dê um clique para ver a lista de propriedades, (2) clique em "Escolher um Crystal Report, (3) Selecione o relatorio que criamos "ReportPaises2", (4) clique em OK.
 No evento Load do formulário cole o seguinte código:

private void FormPaises_Load(object sender, EventArgs e)
{
            Reports.ReportPaises2 cr = new Reports.ReportPaises2();
            crystalReportViewer1.ReportSource = cr;

            cr.SetDataSource(GetListaPaises());

}

Pronto, o relatório está feito, basta pressionar F5 para testar.


Bonus

A propriedade SetDataSource do CrystalReport pode receber qualquer colecção de dados. Por isso aproveita essa propriedade colocar a tua fonte da dados. Como eu disse no inicio deste post, não acho viável os dados serem dependentes da conexão do Crystal Report.

Pesquisar neste blogue

Com tecnologia do Blogger.

Páginas