giovedì 7 giugno 2018

VSTO Outlook utilizzare WCF in un componente aggiuntivo VB.Net e C#

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/programmazione/art_vsto-utilizzare-wcf-in-un-componente-agg_1566.aspx


In questo articolo vedremo come utilizzare in un progetto di tipo VSTO un servizio di tipo Windows Comunication Foundation in Microsoft Outlook 2016.
Riprendiamo l’articolo precedente https://www.iprogrammatori.it/articoli/programmazione/art_vsto-creazione-componente-per-outlook-20_1565.aspx nel quale è stata illustrata una tecnica di creazione di un componente aggiuntivo tramite VSTO e che verificava le informazioni dell’email di tipo pec.
Utilizzando alcune parti di codice del precedente articolo, vedremo questa volta, come trasferire tramite servizio WCF il file allegato e salvarlo nel
Come visto in un precedente articolo, i componenti aggiuntivi permettono di estendere le funzionalità di Outlook e quindi dotarlo di ulteriori funzionalità.

Creazione del progetto

Si crea un nuovo progetto di tipo “Componente aggiuntivo per Outlook” e scriviamo il codice riguardante la creazione del pulsante e barra, come visto nel precedente articolo.
Aggiungiamo alla soluzione anche un progetto di tipo Windows Comunication Foundation, che tramite il metodo che andremo a creare permetterà il salvataggio dei file su file system.



Figura 1 – La creazione del servizio

Stesura del codice

Ora non ci resta che scrivere il codice per l’interfaccia e poi per la classe del servizio.
In particolare dovremmo creare un metodo che passati due parametri, di tipo un array di byte e una stringa, salva sul pc il file allegato.
Il servizio WCF avrà il compito di salvare su file system i file allegati all’email.
Qui di seguito il frammento di codice per l’interfaccia del servizio WCF.


 
VB.Net

<OperationContract()>

    Function GetSalvaFile(ByVal value As Byte(), ByVal nomefile As String) As String

C#

 

        [OperationContract]

        string GetSalvaFile(byte[] value, string nomefile);



 Ora dobbiamo selezionare la classe del servizio dove andremo a scrivere il codice per il salvataggio dei file.
Di norma il nome del servizio si chiama “Service1”, qui di seguito il frammento di codice per entrambi i linguaggi.


 
VB.Net

Public Function GetSalvaFile(ByVal value As Byte(), nomeFile As String) As String Implements IService1.GetSalvaFile

        Dim risultato As String = ""

        Try

            My.Computer.FileSystem.WriteAllBytes("D:\" & nomeFile, value, True)

            

 

            risultato = "OK"

        Catch ex As Exception

            risultato = "Errore: " & ex.Message

        End Try

 

        Return String.Format(risultato)

    End Function

C#

  public string GetSalvaFile(byte[] value, string nomefile)

        {

 

            string risultato = "";

            try

            {

                File.WriteAllBytes("D:\\" + nomefile, value);         

                

 

                risultato = "OK";

            }

            catch (Exception ex)

            {

 

                risultato = "Errore: " + ex.Message;

            }

 

            return risultato;

        }

Terminata la stesura del servizio, non ci resta che andare nel progetto di tipo Outlook ed aggiungerlo tra i riferimenti (riferimenti->aggiungi riferimento al servizio) e nella finestra che viene visualizzata (Figura 2) inserire il percorso web del servizio.


 
 Figura 2 – La realizzazione del servizio

Dopo aver aggiunto il servizio al progetto relativo al componente aggiuntivo, scriviamo il gestore di evento per il pulsante, che al click richiamerà il servizio e passando al metodo l’array byte ed il nome del file.
Il frammento qui di seguito, verifica che l’oggetto selezionato è una email, a questo punto effettua un ciclo su tutti gli allegati presenti nella email che poi invierà tramite il metodo.
Qui di seguito il frammento di codice per entrambi i linguaggi.

 
VB.Net

Private Sub pulsante_Click(Ctrl As Office.CommandBarButton, ByRef CancelDefault As Boolean)

 

        Try

            If Me.Application.ActiveExplorer().Selection.Count > 0 Then

                Dim PR_ATTACH_DATA_BIN As String = "http://schemas.microsoft.com/mapi/proptag/0x37010102"

                Dim objectSelezionato As [Object] = Me.Application.ActiveExplorer().Selection(1)

 

                If TypeOf objectSelezionato Is Outlook.MailItem Then

                    Dim mailElemento As Outlook.MailItem = TryCast(objectSelezionato, Outlook.MailItem)

                    Dim emailTipoPec As Integer = 0

                    Dim servizioWcf As New ServiceTest.Service1Client

 

                    Dim allegatoFile As Byte()

                    For Each elemento As Outlook.Attachment In mailElemento.Attachments

                      

                        allegatoFile = elemento.PropertyAccessor.GetProperty(PR_ATTACH_DATA_BIN)

 

 

                        servizioWcf.GetSalvaFile(allegatoFile, elemento.FileName)

 

 

 

                    Next

 

                End If

            End If

        Catch ex As Exception

            System.Windows.Forms.MessageBox.Show("Errore: " + ex.Message)

        End Try

C#

  private void pulsante_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault)

        {

            try

            {

 

 

                if (this.Application.ActiveExplorer().Selection.Count > 0)

                {

                    Object objectSelezionato = this.Application.ActiveExplorer().Selection[1];

 

                    if (objectSelezionato is Outlook.MailItem)

                    {

                        Outlook.MailItem mailElemento = (objectSelezionato as Outlook.MailItem);

                          string PR_ATTACH_DATA_BIN = "http://schemas.microsoft.com/mapi/proptag/0x37010102";

                          byte[] allegatoFile;

                          ServiceTest.Service1Client servizioWcf = new ServiceTest.Service1Client();

                        foreach (Outlook.Attachment elemento in mailElemento.Attachments)

                        {

 

 

                            allegatoFile = elemento.PropertyAccessor.GetProperty(PR_ATTACH_DATA_BIN);

                            servizioWcf.GetSalvaFile(allegatoFile, elemento.FileName);

 

 

 

                        }

                       

 

                    }

                }

            }

            catch (Exception ex)

            {

                System.Windows.Forms.MessageBox.Show("Errore: " + ex.Message);

            }

        }

 Qui di seguito il codice per la creazione del pulsante e della barra, che è identico a quello del precedente articolo.

 
VB.Net

Private Sub CreaBarra()

        ComBar = Globals.ThisAddIn.Application.ActiveExplorer().CommandBars.Add("PEC", Office.MsoBarPosition.msoBarTop, False, True)

        ComBar.Protection = Office.MsoBarProtection.msoBarNoCustomize

        ComBar.Visible = True

    End Sub

 

 

    Private Sub CreaPulsante()

        'aggiungo il pulsante alla barra ed imposto la proprietà testo oltre al gestore di evento click

        pulsante = TryCast(ComBar.Controls.Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, True), Office.CommandBarButton)

        pulsante.Caption = "Demo PEC VB"

        pulsante.Style = Office.MsoButtonStyle.msoButtonIconAndCaption

        pulsante.TooltipText = "Demo rileva dati PEC VB"

        pulsante.FaceId = 2605

        'gestore dell'evento click

        ' AddHandler pulsante.Click, AddressOf pulsante_Click

        AddHandler pulsante.Click, AddressOf pulsante_Click

 

    End Sub

 

C#

 

   private void CreaBarra()

        {

            ComBar = Globals.ThisAddIn.Application.ActiveExplorer().CommandBars.Add(

                   "PEC",

                   Office.MsoBarPosition.msoBarTop,

                   false,

                   true);

            ComBar.Protection = Office.MsoBarProtection.msoBarNoCustomize;

            ComBar.Visible = true;

        }

 

 

        private void CreaPulsante()

        {

            //aggiungo il pulsante alla barra ed imposto la proprietà testo oltre al gestore di evento click

            pulsante = ComBar.Controls.Add(Office.MsoControlType.msoControlButton, Type.Missing, Type.Missing, Type.Missing, true) as Office.CommandBarButton;

            pulsante.Caption = "Demo PEC CS";

            pulsante.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;

            pulsante.TooltipText = "Demo rileva dati PEC";

            pulsante.FaceId = 2605;

            //gestore dell'evento click

            pulsante.Click += new Office._CommandBarButtonEvents_ClickEventHandler(pulsante_Click);

        }


 Siamo giunti alla conclusione della stesura del codice, ora dobbiamo scrivere il codice che all’evento della creazione del componente esegue la creazione del pulsante e della barra.
Qui di seguito si riporta tale frammento di codice.

 
VB.Net

Private Sub ThisAddIn_Startup() Handles Me.Startup

        CreaBarra()

        CreaPulsante()

    End Sub

 

C#

  private void ThisAddIn_Startup(object sender, System.EventArgs e)

        {

            CreaBarra();

            CreaPulsante();

        }


 Conclusioni

Ora non resta che testare il nostro programma, tramite l’esecuzione del progetto.
Prima di eseguirlo accertarsi che il programma Microsoft Outlook è chiuso.
Come noterà il programmatore, la creazione di componenti di tipo VSTO, agevola lo sviluppo di applicazioni per Office, ed in particolare per Microsoft Outlook, chi già realizza applicazioni di tipo “Windows Application”, troverà tale sviluppo molto semplice.

Le opportunità offerte da questa tecnologia sono ampie sia in termini di sviluppo e sia in termini di business.
Tramite click sul  Download si può scaricare il file di esempio per questo articolo è quello precedente

Nessun commento: