domenica 18 ottobre 2026

C# Windows Forms: estrarre un certificato digitale da un file P7M

In questo esempio vediamo come estrarre un certificato digitale da un file firmato digitalmente in formato .p7m, utilizzando il linguaggio C# e l'ambiente Windows Forms.

Un file P7M può contenere uno o più certificati. Vedremo quindi come recuperare i certificati presenti nella firma e come salvare un certificato in un file con estensione .cer.

1. Estrarre i certificati dal file P7M

Per prima cosa, creiamo una funzione che legge il file P7M e restituisce un oggetto X509Certificate2Collection, contenente i certificati inclusi nella struttura CMS.

C#

  public static X509Certificate2Collection EstraiCertificati(string percorso)

  {

      byte[] dati = File.ReadAllBytes(percorso);

 

      var signedCms = new SignedCms();

      signedCms.Decode(dati);    

 

       

      return signedCms.Certificates;

  }



La funzione legge il contenuto del file, lo decodifica mediante la classe SignedCms e restituisce la raccolta dei certificati presenti nella struttura della firma.

2. Recuperare il nome dal certificato
Per ricavare un nome da utilizzare nel nome del file, possiamo creare una funzione che recupera il nome semplice del certificato.

C#

 

private string RilevaNomeDalSubject(X509Certificate2 certificato)

 {

     return certificato.GetNameInfo(X509NameType.SimpleName, false);

 }


3. Selezionare e salvare il certificato estratto

Di seguito riportiamo il codice che consente di estrarre un certificato dal file P7M e di salvarlo sul computer in formato .cer.



C#

  private void BtnEstraiFileCertificato_Click(object sender, EventArgs e)

  {

      if (string.IsNullOrEmpty(TxtPercorsoNomeFileP7mPerCertificato.Text.Trim()))

      {

          Utility.MessaggioInfo("Selezionare un file firmato di tipo .p7m");

 

          return;

 

      }

 

           

 

      var certificati = EstraiCertificati(TxtPercorsoNomeFileP7mPerCertificato.Text.Trim());

 

      if (certificati.Count == 0)

      {

          MessageBox.Show("Nessun certificato trovato nel file.");

          return;

      }

 

      X509Certificate2 certificato = certificati[0];

            

      string valoreSubectNameCertificato = certificato?.SubjectName?.Name ?? "";

      if (valoreSubectNameCertificato =="")

      {

          valoreSubectNameCertificato = "Certificato";

      }

      using (SaveFileDialog saveFileDialog = new SaveFileDialog())

      {

          saveFileDialog.Filter = "Certificato DER (*.cer)|*.cer";

          saveFileDialog.Title = "Salva il certificato.";

 

          // Suggerisce un nome basato sul subject

          string NomeFile = RilevaNomeDalSubject(certificato);

          saveFileDialog.FileName = $"{NomeFile}.cer";

          saveFileDialog.DefaultExt = "cer";

          saveFileDialog.AddExtension = true;

 

          if (saveFileDialog.ShowDialog() == DialogResult.OK)

          {

              try

              {

                  string percorsoNomeFileDaSalvare = saveFileDialog.FileName;

                        

                  if (certificato != null)

                  {

                      byte[] certBytes = certificato.Export(X509ContentType.Cert);

                      File.WriteAllBytes(percorsoNomeFileDaSalvare, certBytes);

 

                  }

                           

 

 

 

                  MessageBox.Show($"Certificato salvato con successo:\n{percorsoNomeFileDaSalvare}",

                      "Successo", MessageBoxButtons.OK, MessageBoxIcon.Information);

              }

              catch (Exception ex)

              {

                  MessageBox.Show($"Errore nel salvataggio: {ex.Message}",

                      "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);

              }

          }

      }

 

 

  }



Nota: l'estrazione di un certificato da un file P7M non implica che la firma digitale sia valida o che il certificato sia attendibile. Il metodo EstraiCertificati restituisce i certificati inclusi nella struttura CMS, che non necessariamente comprendono l'intera catena di certificazione. Inoltre, il file .cer generato contiene il certificato pubblico, senza la relativa chiave privata.

sabato 17 ottobre 2026

C# Datagridview impostare il colore del testo di una colonna

Tramite la proprietà DefaultCellStyle di una colonna di un controllo DataGridView è possibile personalizzare l'aspetto delle celle, ad esempio impostando il colore del testo mediante la proprietà ForeColor.

Di seguito è riportato un esempio di utilizzo in C#:


C#

dataGridView1.Columns["Nome"].DefaultCellStyle.ForeColor = Color.Blue;

 

dataGridView1.DataSource = dati;



In questo esempio, il colore del testo delle celle della colonna denominata "Nome" viene impostato su blu.
Si noti che l'assegnazione della proprietà DataSource precede la modifica dello stile della colonna, in modo da consentire al controllo di generare le colonne qualora vengano create automaticamente a partire dalla sorgente dati.

giovedì 15 ottobre 2026

Download gioco Broadside Battle Arena

 

gioco gratuito spaziale

È disponibile su Epic Games Store Broadside Battle Arena, un videogioco di genere sparatutto spaziale, in lingua inglese.

Il gioco è scaricabile gratuitamente ed è disponibile per sistemi operativi Windows.

Per maggiori informazioni e per scaricare il videogioco, visitate la pagina ufficiale su Epic Games Store: https://store.epicgames.com/p/broadside-battlearena-a263af

mercoledì 14 ottobre 2026

Download gioco Atlantis Fantasy: Reborn

 

download gioco gratuito Atlantis Fantasy: Reborn

Atlantis Fantasy: Reborn è un videogioco d'avventura disponibile gratuitamente sulla piattaforma Epic Games Store. Il gioco è disponibile in lingua italiana ed è classificato PEGI 3, risultando adatto a un pubblico di tutte le età.

Il videogioco è compatibile con il sistema operativo Windows.

Per maggiori informazioni e per scaricare il gioco, visita la pagina ufficiale su Epic Games Store: https://store.epicgames.com/p/atlantis-fantasy-reborn-6834f9

martedì 13 ottobre 2026

C# ADO.NET: come verificare se i valori di una colonna di un DataTable sono univoci

In questo esempio, vediamo come utilizzare LINQ in ADO.NET per verificare se tutti i valori di una determinata colonna di tipo int di un oggetto DataTable sono univoci, ovvero se non sono presenti duplicati.

Di seguito è riportato un esempio di codice in C#:

C#

bool valoriUnivoci =dttDati.AsEnumerable().Select(r => r.Field<int>("Colonna"))

    .Distinct()

    .Count()

 == dttDati.AsEnumerable().Count();


Il codice estrae i valori della colonna "Colonna", elimina gli eventuali duplicati tramite il metodo Distinct() e confronta il numero di valori distinti con il numero totale di righe del DataTable.

Se i due conteggi coincidono, la variabile valoriUnivoci assume il valore true, indicando che tutti i valori della colonna sono univoci. In caso contrario, assume il valore false, indicando la presenza di duplicati.

Nota: l'esempio presuppone che la colonna esista, sia di tipo int e non contenga valori DBNull.

lunedì 12 ottobre 2026

C# Windows Forms: richiamare un metodo di una form da un'altra form

In questo trucco vediamo come richiamare, in C# e nell'ambiente Windows Forms, un metodo presente in una form (FormA) da un'altra form (FormB), aperta dalla prima.

Per ottenere questo risultato, utilizzeremo un riferimento all'istanza di FormA, che verrà passato a FormB attraverso il suo costruttore.

1. Dichiarazione del metodo nella FormA
Nella form principale, che chiameremo FormA, creiamo un metodo denominato CaricaDati.

Il metodo deve essere dichiarato con il modificatore di accesso public, in modo da poter essere richiamato anche dall'esterno della classe.

Di seguito riportiamo un esempio di implementazione:



C#

public void CaricaDati()

 {

     try

     {

          //Codice

     }

     catch (Exception ex)

     {

         Utility.MessaggioErrore("Errore durante il caricamento dell'applicativo." + ex.Message);

     }

       

       

       

 }

 

2. Dichiarazione del riferimento a FormA nella FormB
Nella seconda form, denominata FormB, dichiariamo un campo privato che conterrà il riferimento all'istanza di FormA.

C#

private Form1? frmPrincipale;



Il simbolo ? indica che il campo può contenere anche un valore null. Questa sintassi è utilizzabile nei progetti C# che supportano i tipi di riferimento nullable.

3. Passaggio del riferimento tramite il costruttore
Sempre all'interno di FormB, aggiungiamo un costruttore che riceve come parametro il riferimento a FormA.

C#

public FormB(FormA frm_Principale)

{

    InitializeComponent();

    frmPrincipale = frm_Principale;

 

}




In questo modo, quando viene creata un'istanza di FormB, possiamo passarle il riferimento alla form principale.

Nota: il parametro del costruttore deve essere di tipo FormA, così da poter accedere ai metodi pubblici definiti in questa classe.

4. Richiamo del metodo dalla FormB
A questo punto, nell'evento Click di un pulsante presente in FormB, possiamo richiamare il metodo CaricaDati() della form principale.


C#

if (frmPrincipale != null)

    frmPrincipale.CaricaDati ();



Prima di eseguire il metodo, verifichiamo che il riferimento a FormA non sia null.
Se il riferimento è valido, il metodo CaricaDati() viene eseguito sull'istanza di FormA che abbiamo ricevuto tramite il costruttore.

5. Apertura di FormB dalla FormA
Infine, torniamo in FormA e modifichiamo il codice che apre la seconda form, passando this al suo costruttore.

C#

 Cursor.Current = Cursors.WaitCursor;

using (FormB frmB = new FormB(this))

{

    frmB.ShowDialog();

}


Cursor.Current = Cursors.Default;



La parola chiave this rappresenta l'istanza corrente di FormA. In questo modo, FormB riceve esattamente il riferimento alla form dalla quale viene aperta.

Abbiamo inoltre utilizzato using per garantire il rilascio delle risorse di FormB al termine del suo utilizzo e finally per ripristinare il cursore anche se si verifica un'eccezione.

Conclusioni
Come abbiamo visto, per richiamare un metodo di una form da un'altra form in C# è possibile passare il riferimento alla form principale attraverso il costruttore della seconda form.

Questo approccio permette di accedere ai metodi pubblici dell'istanza ricevuta senza dover creare una nuova istanza della form principale.

È una soluzione semplice e utile quando si lavora con applicazioni Windows Forms e si desidera far interagire due form tra loro.