Hlavní navigace

Je vaše aplikace schopna běžet pod monem?

2. 12. 2006 0:46 yakeen

Minulý týden byla uvedena aplikace MoMA (Mono Migration Analyzer). Tato aplikace je schopna analyzovat vaši aplikaci a pomoci vám identifikovat možné potíže při portování pro mono. Je schopna poukázat na volání nativních funkcí a na místa která ještě nejsou v monu implementována. Aplikace požaduje pro svůj běh MS.Net 2.0+ nebo Mono 1.2+. Aktuální databáze pro porovnávání odpovídá verzi mona 1.2.1.


Další zajímavou vlastností této aplikace je, že může poslat vývojářům výpis chybějících volání. Vývojáři tím chtějí také zjistit které chybějící třídy, či funkce jsou používány nejčastěji a tudíž by je měli implementovat s větší prioritou. Dvanáct hodin po uvolnění aplikace už bylo posláno 144 analýz a počty rostly. Pojďme se podívat trochu detailněji, projdeme několik statistik a komentářů.


Falešné poplachy
Jedním typem poplašných reportů byly například některé abstraktní třídy, např. System.Net.WebRequest, jejichž implementace je pouze vyhození výjimky NotImplementedException. Vývojáři budou vždy používat odvozené třídy, je to pouze kontrolní mechanizmus.
Dalším typem jsou zvláštnosti v MS .Netu 2.0, zvláště se to týká přepisování virtuálních metod či přepisování pomocí new. Např. z neznámých důvodů základní třída výjimek má vlastní implementaci funkce GetType(). Kód používající tyto volání zkompilovaný pod monem by fungoval bez problémů, nicméně většina těchto nových přepsaných funkcí již byla do mona implementována pro větší kompatibilitu.

Staré MonoTODO atributy
V monu existuje atribut MonoTODO. Používá se pro označení metod, které chtějí vývojáři označit jako nedokončené, neoptimalizované, atp. Tento atribut je jedním z pravidel MoMA. Vývojáři začali procházet takto označené metody a zjistili, že mnoho z nich je tak neoprávněně označeno a pročistili kód.

Používání P/Invoke
V mnoha aplikacích vývojáři používají tuto funkcionalitu a nahlášené výsledky jsou velice zajímavé, mezi nejčastější volání patří:

  • Práce s Windows zprávami: SendMessage, PostMessage.
  • GDI/DC operace: GetDC, CreateBrush, CreateRgn, SelectObject, DrawText.
  • Operace s okny: SetWindowPos, SetForegroundWindow ShowWindow, GetWindowRect, ClientToScreen, MoveWindow and Hook handling.
  • Alokace: GlobalAlloc
  • Práce s fonty a tiskovými dialogy.
  • Přístup k shelu: seznam nedávno použitých souborů, ikony souborů a další.

Díky těmto výsledkům se vývojáři rozhodli naimplementovat vrstvu pro emulaci nejčastějších volání. Některá se zdají být jednoduchá na implementaci např. zpracování Windows zpráv, ikony, práce s okny a alokace paměti. Jiná jako např. GDI/DC volání se zdají náročnější. S první implementací se setkáme pravděpodobně již v některé z blízkých verzí mona.

Statistiky
Z již zmíněných 114 aplikací by pod monem běželo bez jakéhokoli zásahu deset. Hlášení dalších třiceti spadá do kategorie falešných poplachů, popřípadě používají metody, které jsou jednoduché na implementaci.

Alespoň dvacet devět aplikací bylo napsáno pomocí .Net 2.0, jejich hlášení spadají většinou pod falešné poplachy druhého typu. Šestnáct aplikací bylo napsáno ve Visual Basicu, jedna aplikace používala IKVM.

Třicet dva aplikací bylo pro ASP.NET, 56 používalo System.Windows.Forms, 32 System.Data, 44 System.Drawing.

Použití P/Invoke v aplikacích:

  • 67 neobsahovalo P/Invoke volání.
  • 9 obsahovalo 1 až 3 P/Invoke volání.
  • 10 obsahovalo 4 až 10 P/Invoke volání.
  • 9 obsahovalo 11 až 20 P/Invoke volání.
  • 5 obsahovalo 22 až 48 P/Invoke volání.
  • 6 obsahovalo 55 až 100 P/Invoke volání.
  • 5 obsahovalo 102 až 180 P/Invoke volání.
  • 3 obsahovaly více než 200 P/Invoke volání. V těchto třech případech více než polovina použitých P/Invoke volání byla pro vlastní knihovny.

Z tohoto pohledu více než polovina aplikací může být portována bez P/Invoke volání. A více než 40% by mělo jít přeportovat bez větších problémů.

Závěrem
V době kdy toto píšu je už posláno přes 244 reportů. Osobně tuto aplikaci hodnotím jako velký počin k zajištění kompatibility. Pokud chcete aby vaše aplikace běhala bez problémů pod monem, stáhněte si MoMA a testujte. Čím více poslaných výsledků tím kompatibilnější mono bude :)