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

In questo articolo viene illustrata una tecnica di come utilizzare un servizio WCF in VSTO nella creazione di componenti aggiuntivi per Microsoft Outlook 2016.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

 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