Staňte se programátorem: Aplikace s podporou doplňků

Dnes si napíšeme jednoduchý poštovní program, na kterém si ukážeme, jak lze program rozšiřovat o libovolné doplňky – pluginy. Zatím jen experimentální, příště ale už zcela funkční.
Staňte se programátorem: Aplikace s podporou doplňků

V dnešním díle si napíšeme velmi jednoduchý klient s podporou doplňků. Program bude umět odesílání e-mailových zpráv, k čemuž nám pomohou třídy uložené ve jmenném prostoru System.Net.Mail. Pro čtení e-mailových zpráv přes protokol POP3 však v .NETu třídy neexistují, a proto si je budeme muset napsat v sami. Funkce čtení zpráv bude přidána k našemu programu jako plugin a vytváření rozšíření bude hlavní náplní dnešního článku.

Nejprve si ukážeme, jak vlastně takový doplněk funguje, funkce pro příjem pošty pomocí POP3 protokolu bude obsahem některého z dalších dílů. Na základě dnešního článku tedy budete moci aplikaci libovolně rozšiřovat o nové funkce pomocí knihoven.

Odesílání e-mailový zpráv

Pro odeslání e-mailové zprávy musíme nejprve vytvořit instanci třídy MailMessage ze jmenného prostoru System.Net.Mail, do jejíhož konstruktoru zadáme adresu odesilatele, příjemce, předmět a obsah zprávy. Pro přidání příloh použijeme metodu Attachments.Add třídy MailMessage. Tato metoda očekává jako argument instanci třídy Attachment představující konkrétní přílohu.

 Klepněte pro větší obrázek
Rozhraní jednoduchého pošťáka a možnost přidání přílohy

Zprávu odešleme pomocí metod Send/SendAsync třídy SmtpClient. Metodu Send použijeme v případě, že chceme, aby program čekal na odeslání e-mailové zprávy. Použijeme-li metodu SendAsync, odeslání zprávy bude zprostředkováno na novém pracovním vlákně, díky čemuž bude možné s aplikací dále volně pracovat.

MailMessage zprava = new MailMessage(“odesilatel@xyz.cz”,
                                     “prijemce@xyz.cz”, 
                                     “Předmět”, 
                                     “obsah”);

if (prilohy != null)
  for (int x = 0; x < prilohy.Length; x++)
    {
      zprava.Attachments.Add(new Attachment(prilohy[x]));
    }

SmtpClient s = new SmtpClient(“smtp server”);
s.SendAsync(zprava, null);

Klient je velmi jednoduchý, můžete jej ale rozšířit třeba o použití autentizovaného a zabezpečeného SMTP serveru a odesílat tak zprávy třebas pomocí Gmailu, Seznamu aj.

Vytváření pluginů

Pluginy (což jsou externí dynamické knihovny) slouží k tomu, aby dodávaly již hotové aplikaci nějakou novou funkcionalitu aniž by bylo potřeba mít přístup ke zdrojovým kódům aplikace a nějak do nich zasahovat. Aplikace, které podporují doplňky, jsou snadno rozšiřitelné, což je velká výhoda, protože tak umožňují ostatním programátorům snadno vylepšovat aplikaci.

Klepněte pro větší obrázek
Pokud se náš experimentální doplněk načte ze složky Plugins,
vytvoří se nová záložka a prozatím jen vypíše krátká zpráva

Pěkným příkladem takto rozšiřitelné aplikace je Microsoft Visual Studio.Net, které samo o sobě neobsahuje prostředí pro žádný programovací jazyk, ale při instalaci si uživatel volí jaké rozšíření (programovací jazyky) chce instalovat. Krom toho je možné do Visual Studia nové vývojové nástroje doinstalovat i později.

Jiným typickým příkladem pluginů jsou obrázkové efekty v grafických editorech. Aby plugin fungoval, musí být jeho třídy, jež mají být v programu použity, odvozeny od rozhraní, které je znají obě strany – jak cílová aplikace, tak samotný plugin. To se řeší další knihovnou, která obsahuje daná rozhraní. V našem projetku se tato knihovna jmenuje Core a obsahuje jedno rozhraní IPlugBase.

public interface IPlugBase
{
  UserControl Ctrl {get;}
  string Title{get;}
}

Třída odvozená od tohoto rozhraní musí mít dvě vlastnosti Ctrl a Title. Vlasnost Ctrl vrací uživatelský prvek, který bude do aplikace přidán z pluginu přidán. V našem případě to jsou komponenty určené k přijímání e-mailových zpráv. Vlastnost Title zase vrací popis toho, co daný uživatelský prvek dělá. V tomto případě to je “Příjem zpráv”.

public class Plugin : IPlugBase
{
  UserControl1 usc;
  public Plugin()
 {
    UserControl1 usc = new UserControl1();
    this.usc = usc;
 }
  public UserControl Ctrl
  {
    get
    {
      return usc;
    }
  }
  public string Title
  {
    get
    {
      return "Příjem zpráv";
    }
  }
}

Pro vytvoření instancí tříd uložených v pluginu slouží metoda CreateInstance třídy System.Reflection.Assembly, která vytvořenou instanci vracízaboxovanou v datovém typu object, a proto je nutné ji přetypovat na rozhraní, ze kterého je odvozena – v našem případě to je rozhraní IPlugBase uložené v knihovně Core. Více napoví následující kód:

private void Form1_Load(object sender, EventArgs e)
{
  int i = 1; 
  // Jednotlivě prochází všechny dinamické knihovny ve složce Plugins
  foreach (string s in Directory.GetFiles(Application.StartupPath + @"\Plugins"))
  {
    // Načte DLL
    Assembly ass = Assembly.LoadFrom(s);
    Core.IPlugBase b = null;
    // Projde jednotlivé datové typy v Dll
    foreach (Type t in ass.GetTypes())
    {
      // Pokud se datový typ nazývá Plugin...
      if (t.Name == "Plugin")
      {
        // … je to ten, který je odvozen od rozhraní IPlugBase, a proto
        // lze z něho vytvořit instanci.
        b = (Core.IPlugBase)ass.CreateInstance(t.FullName);'
      }
    }
    // Použití instance
    this.tabControl1.TabPages.Add(b.Title);
    tabControl1.TabPages[i].Controls.Add(b.Ctrl);
    i++;
  }
}

Dnešní projekt se tedy skládá ze třech programů. Prvním je samotné rozhraní elektronického pošťáka, druhým je propojovací knihovna Core a třetím už samotný pagin pro příjem pošty POP3. Ten zatím nic neumí, pouze v aplikaci vytvoří novou záložku a vypíše do jejího panelu krátký text. To vše již řeší samotný doplněk, nikoliv pošťák. Obsahem POP3 knihovny tedy může být jakýkoliv kód, který pozmění funkce pošťáka podle toho, co mu dovolí propojovací knihovna Core.

Vzhledem ke specifičnosti dnešního projektu vám nabídneme pouze zdrojový kód pro Microsoft Visual C# 2008 Express Edition a vyšší.


Mareš, Amadeo: 1001 tipů a triků pro C#

Klepněte pro větší obrázekNestačí vám náš seriál? Pořiďte si knihu jeho autora, ve které vás seznámí s tisícovkou programovacích tipů a technik. Díky velkému počtu tipů, návodů, triků a rad kniha poslouží při každé příležitosti. Kdykoli si nevíte rady, stačí nalistovat příslušnou stranu a problém okamžitě vyřešit. Tipy a triky míří především na začínající programátory; užitečné rady tu ovšem najdou i pokročilejší vývojáři a ostřílení znalci. SOučástí publikace je i přiložené DVD, na kterém najdete bezplatné vývojové prostředí Visual C#, databázový server a především všechny zdrojové kódy z knihy, takže je budete moci okamžitě použít. Webové stránky knihy.

Témata článku: Programování, Doplňky do prohlížeče, Podpora, Attachment, Kody, Krátká zpráva, Programátor, 1001, Doplňky, Send, Knihovna, Public, Nová metoda

Určitě si přečtěte

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

** Po půl roce je tu další aktualizace Windows ** A opět přináší hlavně hromadu drobných kosmetických vylepšení ** Podívali jsme se na ty nejzajímavější

Včera | Jakub Čížek | 110

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

** Fluent Design je vzhled, do kterého postupně Microsoft převleče celý systém ** Staví na průhlednosti a velkých plochách ** Do Windows 10 se z části dostane už zítra při vydání podzimní aktualizace

16.  10.  2017 | Stanislav Janů | 150


Aktuální číslo časopisu Computer

Nový seriál o programování elektroniky

Otestovali jsme 17 bezdrátových sluchátek

Jak na nákup vánočních dárků ze zahraničí

4 tankové tiskárny v přímém souboji