14. Spolupráce s existujícím kódem

Autoři platformy .NET a jazyka C# umožnili programátorům použít stávající programy. Používáme-li takovéto programy, zříkáme se výhod, které poskytuje CLR. Hovoříme pak o neřízeném kódu. Existují tři hlavní oblasti použití.

  • Spolupráce s komponentami modelu COM - schopnost prostředí .NET používat komponenty modelu COM a naopak komponentám modelu COM používat prvky prostředí .NET.

    • Použití existující COM komponenty v .NET aplikaci.

      1. Nejprve je nutné COM komponentu registrovat v registry (nástroj regsvr32.exe).

      2. Vytvoříme nový projekt v jazyce C#. V okně Solution Explorer aplikace Visual Studio vybereme položku Add Reference.

      3. Najdeme příslušnou COM komponentu.

      4. Reference na tuto komponentu byla přidána a lze ji normálně používat (tedy instanciovat a pak volat její metody,....).

    • Použití .NET komponenty na místo COM komponenty.

      1. Vytvoříme nový C# projekt typu Class Library.

      2. Komponentu musíme zaregistrovat v Registry. K tomu složí nástroj regasm.exe.

      3. Pro programy, které pracují s typovanými knihovnami lze vygenerovat potřebný .tlb soubor nástrojem tlbexp.exe

      4. Pak lze tuto komponentu využívat stejně jako COM komponentu.

    Více o spolupráci s COM komponentami bude v následujících kapitolách.

  • Spolupráce s běžnými knihovnami DLL - tyto služby umožňují programátorům v prostředí .NET používat knihovny DLL. Následující příklad ukazuje volání metody MessageBox z knihovny User32.dll.

    using System;
    using System.Runtime.InteropServices;
    
    class RunApp
    {
      [DllImport("user32.dll", EntryPoint="MessageBox")]
      static extern int NiceWindow(int hWnd, string msg,string caption,int type);
      
      static void Main(string[] args)
      {
        NiceWindow(0,"Hello world!","C# is calling!",0);
      }
    }
    • Platform Invocation Services (PInvoke) - tyto služby umožňují řízenému kódu pracovat s knihovnami a funkcemi exportovanými z dynamických knihoven.

    • Knihovna DLL je importovaná pomocí atributu DllImport.

    • Importované funkce musí být označeny jako externí (klíčové slovo extern).

    • Importovanou funkci lze pro použití v jazyce C# přejmenovat. Slouží k tomu pojmenovaný parametr EntryPoint atributu DllImport.

  • Nezabezpečený kód - umožňuje programátorům v jazyce C# používat například ukazatele. Takto vytvořený program není spravován CLR systému .NET.

    • Blok je definován pomocí klíčového slova unsafe a složenými závorkami.

    • Klíčové slovo unsafe lze použít také jako modifikátor u metody případně tříd.

    • Je nutné překladači povolit unsafe bloky (Project-Properties-Configuration Properties-Build-Allow Unsafe Code Blocks).

    • Používáme-li přímý přístup do paměti, mohlo by dojít ke srážce s algoritmem garbage collection.

    • Klíčové slovo fixed je nástrojem určeným pro znehybnění kusu paměti.

      fixed (type* pointer = expression) statement