it-swarm-eu.dev

Mono se často používá k vyjádření „Ano, .NET je multiplatformní“. Jak je tento nárok platný?

V Co byste si vybrali pro svůj projekt mezi .NET a Java v tomto okamžiku? Říkám, že budu uvažovat o „Vždy se nasadíte do Windows? „Jediné nejdůležitější technické rozhodnutí, které se má stát před novým webovým projektem, a pokud je odpověď„ ne “, doporučuji namísto .NET Java).

Velmi častým protiargumentem je, že „Pokud bychom někdy chtěli běžet na systému Linux/OS X/Anyever, spustíme pouze Mono“1, což je na povrchu velmi přesvědčivý argument, ale nesouhlasím z několika důvodů.

  • OpenJDK a všichni dodavatelé, kteří dodali JVM, prošli oficiálním Sun TCK zajišťujícím, že věci fungují správně. Nevím o tom, že Mono předá Microsoft TCK.
  • Mono sleduje vydání .NET. Která úroveň .NET je v současné době plně podporována?
  • Fungují všechny prvky GUI (WinForms?) Správně v Mono?
  • Podniky možná nebudou chtít být závislé na rámcích Open Source jako oficiální plán B.

Jsem si vědom toho, že s novou správou Java od společnosti Oracle) je budoucnost nebezpečná, ale např. IBM poskytuje JDK pro mnoho platforem , včetně Linuxu. otevřené zdroje.

Za jakých okolností je tedy Mono platnou obchodní strategií pro aplikace .NET?


1Mark H to shrnul jako : "Pokud je tvrzení, že " Mám Windows aplikaci napsanou v .NET, měla by běžet na mono ", pak ne, nejedná se o platný nárok - ale Mono vynaložilo úsilí na zjednodušení přenosu takových aplikací. "

171
user1249

Sparkieho odpověď to mám, nech mě se trochu doplnit.

„.NET je multiplatformní“ je příliš nejednoznačné tvrzení, protože jak rámec, tak svět, pro který byly původně vytvořeny, se změnily a vyvinuly.

Krátká odpověď zní:

Podkladový modul, který pohání .NET a jeho deriváty, Common Language Infrastructure Standard, je napříč platformami a jako kdybyste chtěli nechat svůj kód přejít na více platforem, musíte plánovat použití správná rozhraní API na správné platformě , která poskytují nejlepší zkušenosti na každé platformě.

Rodina CLI nezkusila přístup „Write Once, Run Anywhere“, protože rozdíly mezi telefonem a sálovým počítačem jsou příliš velké. Místo toho se objevil vesmír API a runtime funkcí, které jsou specifické pro platformu, aby vývojářům poskytli správné nástroje k vytváření skvělých zkušeností v každé platformě.

Přemýšlejte o tom: programátoři již necílí na počítače se systémem Windows ani na servery Unix. Svět je nyní více než kdy jindy obklopen fascinujícími platformami od PC, herními konzolami, výkonnými telefony, set-top boxy, velkými servery a distribuovanými klastry strojů. Jedna velikost, která se vejde na všech platformách, by se na malých zařízeních cítila nafouknutá a na velkých systémech by byla poddimenzovaná .

Produkt Microsoft .NET Framework není multiplatformní, běží pouze na Windows. Existují variace rozhraní .NET Framework od společnosti Microsoft, které běží na jiných systémech, jako je Windows Phone 7, XBox360 a prohlížeče prostřednictvím Silverlight, ale všechny jsou mírně odlišné profily.

Dnes můžete zacílit na všechny hlavní operační systémy, telefony, mobilní zařízení, vestavěný systém a server pomocí technologií založených na technologii .NET. Zde je seznam, který ukazuje, kterou implementaci CLI byste použili v každém případě (tento seznam není úplný, ale měl by pokrývat 99% případů):

  • počítače typu x86 a x86-64:
    • se systémem Windows -> Obvykle spouštíte .NET nebo Silverlight, ale můžete zde také použít plné mono.
    • se systémem Linux, BSD nebo Solaris -> Spouštíte plný Mono nebo Silverlight
    • se systémem MacOS X -> Spustíte plný Mono nebo Silverlight
    • running Android - -> Spustíte podmnožinu Mono/Android
  • Počítače ARM:
    • Používání Windows Phone 7: provozujete Compact Framework 2010
    • Používáte Windows 6.5 a starší: spouštíte starý Compact Framework
    • Zařízení Android: používáte Mono/Android
  • Počítače PowerPC:
    • Provozujete plné mono pro plné operační systémy Linux, BSD nebo Unix
    • Provozujete zabudované Mono pro PS3, Wii nebo jiné vestavěné systémy.
    • Na XBox360 spustíte CompactFramework
  • S390, S390x, Itanium, SPARC:
    • Běžíš úplně Mono
  • Další vestavěné operační systémy:
    • S mobilním profilem spouštíte .NET MicroFramework nebo Mono.

V závislosti na vašich potřebách může výše uvedené stačit nebo ne. Sotva získáte stejný zdrojový kód, který bude možné spustit všude. Například kód XNA nebude běžet na každé ploše, zatímco software .NET Desktop nebude běžet na XNA nebo na telefonu. Obvykle je třeba provést změny v kódu, aby se spustil v jiných profilech rozhraní .NET Framework. Zde jsou některé z profilů, o kterých vím:

  • .NET 4.0 Profil
  • Profil Silverlight
  • Windows Phone 7 Profil
  • Profil XBox360
  • Mono core Profile - sleduje profil .NET a je k dispozici v systémech Linux, MacOS X, Solaris, Windows a BSD.
  • .NET Micro Framework
  • Mono na profilu iPhone
  • Mono on Android Profil
  • Mono na profilu PS3
  • Mono na profilu Wii
  • Profil Moonlight (kompatibilní s Silverlight)
  • Rozšířený profil Moonlight (Silverlight + plný .NET 4 API přístup)

Každý z těchto profilů je tedy ve skutečnosti poněkud odlišný, a to není špatná věc. Každý profil je navržen tak, aby se vešel na jeho hostitelskou platformu a vystavil API, která dávají smysl, a odstraňovala ty, které nedávají smysl.

Například rozhraní Silverlight pro ovládání hostitelského prohlížeče nemají v telefonu smysl. A shadery v XNA nedávají smysl na hardwaru PC, kterému chybí ekvivalentní podpora.

Čím dříve si uvědomíte, že .NET není řešením, jak izolovat vývojáře od základních schopností hardwaru a nativní platformy, tím lépe budete.

To začíná říkat, že některá rozhraní API a zásobníky jsou k dispozici na několika platformách, například ASP.NET lze použít ve Windows, Linux, Solaris, MacOS X, protože tato API existují jak v .NET, tak v Mono. Technologie ASP.NET není k dispozici na některých platformách podporovaných společností Microsoft, jako je XBox nebo Windows Phone 7, a není podporována ani na jiných platformách, které Mono podporuje, jako je Wii nebo iPhone.

Následující informace jsou správné pouze od 21. listopadu a mnoho věcí ve světě Mono se pravděpodobně změní.

Stejné zásady lze aplikovat i na jiné sady, úplný seznam by vyžadoval řádnou tabulku, kterou netuším, jak se zde představit, ale zde je seznam technologií, které nemusí být na konkrétní platformě přítomny. Můžete předpokládat, že je k dispozici cokoli zde neuvedené (neváhejte mi posílat úpravy za věci, které jsem zmeškal):

Core Runtime Engine [všude]

  • Reflection.Emit Support [všude kromě WP7, CF, Xbox, MonoTouch, PS3]
  • Podpora CPU SIMD [Linux, BSD, Solaris, MacOS X; Brzy PS3, MonoTouch a MonoDroid]
  • Pokračování - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
  • Vykládka sestavy [pouze Windows]
  • VM Injection [Linux, BSD, MacOS X, Solaris]
  • DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
  • Generika [některá omezení pro PS3 a iPhone].

Jazyky

  • C # 4 [všude]
  • Kompilátor C # jako služba (Linux, MacOS, Solaris, BSD, Android)
  • IronRuby [všude, spusťte WP7, CF, Xbox, MonoTouch, PS3]
  • IronPython [všude, spouštět WP7, CF, Xbox, MonoTouch, PS3]
  • F # [všude, spouštět WP7, CF, Xbox, MonoTouch, PS3]

Zásobníky serveru

  • ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
  • ADO.NET [všude]
  • LINQ na SQL [všude]
  • Entity Framework [všude]
  • Základní zásobník XML [všude]
    • Serializace XML [všude kromě WP7, CF, Xbox)
  • LINQ do XML (všude)
  • System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
  • System.Messaging [Windows; v systémech Linux, MacOS a Solaris vyžaduje RabbitMQ]
  • .NET 1 Enterprise Services [pouze Windows]
  • WCF [kompletní na Windows; malá podmnožina na Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
  • Pracovní postup Windows [pouze Windows]
  • Identita prostoru na kartě [pouze Windows]

Zásobníky GUI

  • Silverlight (Windows, Mac, Linux - s Moonlight)
  • WPF (pouze Windows)
  • Gtk # (Windows, Mac, Linux, BSD)
  • Windows.Forms (Windows, Mac, Linux, BSD)
  • MonoMac - integrace nativního Macu (pouze Mac)
  • MonoTouch - Nativní integrace iPhone (pouze iPhone/iPad)
  • MonoDroid - Nativní Android Integrace (pouze Android)
  • Rozhraní API Media Center - pouze Windows
  • Nepořádek (Windows a Linux)

Grafické knihovny

  • GDI + (Windows, Linux, BSD, MacOS)
  • Křemen (MacOS X, iPhone, iPad)
  • Káhira (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)

Mono Libraries - Cross Platform, lze použít v .NET, ale vyžadují ruční sestavení

  • Kompilátor C # 4 jako služba
  • Cecil - CIL Manipulace, workflow, instrumentace CIL, linkery
  • Knihovny RelaxNG
  • Poskytovatelé databáze Mono.Data. *
  • Úplný System.Xaml (pro použití v instalacích, kde .NET nenabízí zásobník)

MonoTouch znamená Mono běžící na iPhone; MonoDroid znamená Mono běžící na Androidu; Porty PS3 a Wii jsou k dispozici pouze pro vývojáře Sony a Nintendo.

Omlouvám se za nedostatek formality.

195
miguel.de.icaza

Nejprve je třeba rozlišovat mezi Common Language Infrastructure (The Open Standard) a .NET (Microsoft implementace tohoto standardu). Mono je implementace CLI a nikdy netvrdil, že je "přenosný .NET". Jazyk C # je také otevřený standard a není přísně vázán na .NET.

Nevím, zda má společnost Microsoft nějaký nástroj k ověření, zda je implementace kompatibilní, ale pokud ano, jsem si docela jistý, že ji mají mono a používají ji.

Mono jde za .Net, ale sotva. Mono může spouštět kód C # 4.0 (aktuální .NET verze). Společnost Microsoft také nedávno vytvořila veškerý otevřený zdrojový kód a knihovny DLR (pod licencí Apache 2.0), která umožnila mono používat jazyky jako IronPython, IronRuby a F # byla otevřena pouze minulý týden. Kromě toho společnost Microsoft pravidelně vydává CTP připravovaných funkcí v rozhraní .NET, což vývojářům mono umožňuje průběžně aktualizovat aktuální verze verzí.

V prostředí .NET existuje řada nástrojů a rozšíření, například smlouvy o kódu. Ty nejsou vždy plně implementovány v mono. (V současné době se domnívám, že existuje smlouva o částečném ověřování smluv vyžadujících). Tyto aplikace se v aplikacích .NET každopádně běžně nepoužívají, ale pokud se jejich popularita zvýšila, zvýšila by se také míra jejich implementace v mono.

WinForms nejsou (zcela) přenosné. Jsou specifické pro .NET a nejsou součástí CLI. CLI neurčuje žádnou konkrétní sadu widgetů. Existují však sady widgetů pro různé platformy (GTK # a Silverlight). Pokud jste psali aplikaci od základu s ohledem na přenositelnost, použijte jednu z nich spíše než Winforms/WPF. Kromě toho poskytuje mono tenký obal pro rozhraní Winforms API, což umožňuje snadnější přenos existujících aplikací winforms do GTK # (bez úplného přepisování).

Mono poskytuje nástroj, Mono Migration Analyzer (MoMA), který může vzít existující .Net aplikaci a říct vám o jeho přenositelnosti. (např. identifikovat použité nepřenosné knihovny, P/Invoke atd.).

Pro firmy, které se nechtějí spoléhat na Open Source - lze mono licencovat. Vlastnictví kódu přidaného k mono je předáváno společnosti Novell, která jej může licencovat jiným způsobem, než je obvyklá licence LGPL (která má stejně velmi málo omezení).

Pokud jde o tvrzení „.NET je přenosný“, myslím, že to může být platné tvrzení, pokud píšete kód od základu a jste si vědomi problémů s přenositelností v rámci. Pokud je tvrzení, že „Mám aplikaci pro Windows napsanou v .NET, měla by běžet na mono“, pak to není, není to platný požadavek - ale Mono se snažil zjednodušit přenesení takových aplikací.

115
Mark H

Bod po bodu:

  • OpenJDK a všichni dodavatelé, kteří dodali JVM, prošli oficiálním Sun TCK zajišťujícím, že věci fungují správně. Nejsem si vědom Mono předávání Microsoft TCK.
    Existuje specifikace, se kterou Microsoft CLR vyhovuje. Mono není klon Microsoft CLR, ale spíše implementace stejné specifikace. Na jedné straně existuje šance, že to povede k ještě větší nekompatibilitě. V praxi to fungovalo velmi dobře pro mono.
  • Mono sleduje vydání .NET. Jakou úroveň .NET je aktuálně plně podporována?
    Protože dokumentace pro .Net předchází skutečnému vydání, mono skutečně dokončilo (nikoli beta verzi) podporu pro .Net 4 out před oficiální vydání společnosti Microsoft. Mono také velmi dobře dokumentuje, co není podporováno, a má několik nástrojů, které můžete spouštět proti stávajícímu projektu, což vám pomůže najít místa s potenciálem pro nekompatibilitu.
  • Fungují všechny prvky GUI (WinForms?) Správně v Mono?
    Převážná většina formulářů funguje dobře. WPF, ne tolik. Slyšel jsem, že totéž platí pro Java - mnoho pokročilých nástrojů widget/gui není na všech platformách podporováno.
  • Firmy nemusí chtít záviset na rámcích Open Source jako oficiální plán B.
    Pokud tomu tak je, určitě se s Javou nebudou chovat, protože tím se plán open source ještě zvýší na plán A.

Stručně řečeno, pokud chcete vytvořit aplikaci napříč platformami právě teď , není nic špatného začít s mono od get-go a používat to jako váš rámec. Můžete dokonce nasadit mono na Windows, pokud budete chtít.

Na druhou stranu, pokud se dnes díváte na vytváření aplikace pro Windows, o které si myslíte, že může potřebovat křížovou platformu v nějakém neznámém bodě v do budoucna pravděpodobně budete chtít jít s nativními widgety a nástroji Windows. .Net zde dělá mnohem lepší práci než Java a mono je v tomto scénáři naprosto přijatelný pokles.

Jinými slovy: Ano,. Net, pokud napříč platformami ve všech ohledech záleží na vaší otázce. Ne, mono nebude jen spouštět každý .Net program z krabice, ale vaše otázka je v kontextu nového projektu. Zabránit problémům s kompatibilitou není třeba mnoho práce, aby se zabránilo problémům s kompatibilitou, zvláště pokud uvažujete spíše o vývoji pro mono než o vývoj pro .Net.

Především si však myslím, že je to především špatná otázka. Pokud nepostavíte nový vývojový tým od začátku, začnete s programátory, kteří mají odborné znalosti v jedné nebo druhé oblasti. Nejlepších výsledků dosáhnete spojením toho, co již vaši programátoři vědí. Stejně jako se může zdát sestavení aplikace napříč platformami, může se vám zdát, že pokud máte tým plný programátorů .Net s malými zkušenostmi Java, je nepravděpodobné, že je vyhodíte nebo vás všechny naučí Java pro váš další projekt. Pokud máte tým plný programátorů Java, nebudete je žádat, aby se učili .NET pro projekt pouze pro Windows. Každá z nich by byla ořechy.

14
Joel Coehoorn

Pracoval jsem s Mono a řekl bych, že je stejně dobrý, jak se můžete dostat s alternativní platformou, která je open-source a není přímo podporována společností Microsoft. Pokud můžete být spokojeni s použitím alternativní open-source platformy, jako je Clojure nebo Scala, pravděpodobně byste měli být s Mono pohodlní.

Úroveň .NET podporovaná Mono lze vždy najít na stránce Mono Roadmap .

Fungují všechny prvky grafického uživatelského rozhraní? Pokud vím, dělají to, i když jsem všechny prvky vyčerpávajícím způsobem nezkoušel.

Je Mono identické s .NET? Ne. Mám podezření, že tu a tam budou potřeba drobná (a možná velká) vylepšení. V současné době s ním například nemůžete spouštět Entity Framework.

11
Robert Harvey

Jako cíl se .NET/mono vesmír pohybuje velmi rychle .

Společnost Microsoft přichází každých několik let s několika přesvědčivými změnami a inovacemi týkajícími se jazyka, runtime a infrastruktury obklopující .NET. Například: Generics, LINQ, DLR, Entity Framework - s každou novou revizí Visual Studio je obecně značně zvýšen soubor funkcí a užitečnost rámce, na který je zaměřen.

Přestože je neustálé zlepšování rámce vítáno, je také problematické, pokud chcete kompatibilitu na více platformách. Dlouhodobě podporované platformy, jako je Red Hat Enterprise Linux, se pohybují ledovitě pomaleji, pokud jde o zavádění nových technologií, a v každém daném okamžiku dojde k významné vylepšení na platformě Mono, k níž došlo právě v posledních několika měsících. Takže pokud chcete spustit věci, které skvělé děti staví, budete muset sestavit Mono od nuly a spravovat své vlastní záplaty a aktualizace. To není super.

Java, na druhé straně, je stejně stagnující jako fond pro děti. Obzvláště nyní, když je to vlastní společnost, která právě chtěla Java pro patentové žaloby, můžete být si docela jistý, že v dohledné budoucnosti nedojde k detekovatelným změnám jazyka nebo runtime. Java je stejně stabilní platforma jako FORTRAN. To není tak dobré, pokud jste doufali v jakýkoli druh vylepšení, ale není to tak špatné, pokud se pokoušíte nasadit podnikovou aplikaci.

9
tylerl

Z pohledu uživatele Mono naštve, aby byly aplikace Windows .NET kompatibilní s Linuxem. Pokud se vlastně pokusíte spustit v Mono libovolně slušně napsanou aplikaci Windows, nebude to fungovat.

Z pohledu baliče (já jsem v PortableApps dělal trochu práce) může být .NET požehnáním i prokletím. Pokud jste pouze na Windows, .NET usnadňuje nasazení, protože více knihoven znamená méně na systému závislé věci (věřím zejména mezi verzemi Windows), ale je také velmi matoucí i na Windows, protože verze .NET nejsou zpětně - kompatibilní nebo dopředu kompatibilní. Musíte si stáhnout různé verze .NET pro různé programy.

To znamená, že Mono je dobrým výchozím bodem pro výrobu C # programů napříč platformami. Jednoduše zabalte program do nejnovějšího WINE a označte jej za hotový. Podívejte se, kam to vzalo Picasu.

Stejně jako u dvou jazyků/platforem politická stabilita, RMS) by se pravděpodobně začalo chvástat o tom, jak Mono stojí v čele Novell, jehož líbánky s Microsoftem jsou docela notoricky známé. Obě platformy lze nyní považovat za politicky nestabilní .

Pokud opravdu potřebujete snadnou platformu, vyzkoušenou a skutečnou cestou je QT, která je od nynějška politicky stabilní, je to a) LGPL'd, b) udělané s hlavními problémy s licencováním za poslední roky a c) podporované společností Nokia, který prodává opravdu populární telefony.

7
digitxp

Mono není port 1: 1 společnosti Microsoft .net. Existují technologie, které Mono jednoduše neimplementuje nebo nemá v úmyslu tak učinit (např. Workflow Foundation nebo WPF ), zatímco na druhé straně mají některé technologie, které Microsoft .NET nedělá, např. SIMD Extensions.

Krátká odpověď: Mono a Microsoft .NET jsou založeny na stejném základu - CIL a BCL - ale jsou to samostatné projekty.

4
Michael Stum

Malý komentář k výrokům v původním příspěvku. Budu tvrdit, že TCK zůstává teoretickým nástrojem, který Oracle umožňuje tvrdit, že Java je otevřený standard. Protože pokud si to všimnete, Apache Harmony se již několik let snaží neúspěšně certifikovat jako „Java“. Je zřejmé, že Oracle se opravdu nezajímá o implementaci open source kromě té, ke které jsou přidruženi, a více či méně kontroly (OpenJDK), která btw. podobně jako Mono není kompletní (tj. žádná podpora Java Web Start) a chybí některé optimalizace dostupné v implementaci HotSpot uzavřeného zdroje.

Tak patrně od roku 2010; (většina) Java je otevřený zdroj, ale nikoli otevřený standard, zatímco (většina) .NET není otevřený zdroj, ale otevřený standard. Výjimky jsou samozřejmě, že DLR, IronPython, IronRuby a F # jsou ve skutečnosti open source. Mono je zajímavé, protože poskytuje to nejlepší z obou světů, open source implementace otevřených standardů.

2
Casper Bang

Když odejmeme všechny technické aspekty, při psaní kódu se odehrává velmi důležitá část.

Stejně jako u jakékoli technologie napříč platformami (ať už se jedná o Java, Python, Ruby ...), pokud kód není napsán s ohledem na přenositelnost, měli byste předpokládat, že v zásadě je nulová šance, že kód bude správně fungovat (i když je taková šance ve skutečnosti mnohem, mnohem vyšší), protože zvláštní chování by mohlo být docela kritické. Přečtěte si: Neberte si náhodné shromáždění a nespouštějte ho pod Mono.

Přesto pro nový projekt (nebo ten, který můžete snadno refaktorovat), zvolíte .Net/Mono jako potenciálně přenosný běhový modul, má smysl, ale ušetříte spoustu potíží testováním kódu na Mono velmi brzy, i když projekt má pouze nepatrná změna multiplatformy. Používáte-li server pro nepřetržitou integraci, může to být stejně snadné jako nastavení uzlu Mono build. Mnoho problémů může být vyřešeno během vývoje, pouhým vytvořením návyku (jako je například vytváření řetězců cest) a obrovský kus vašeho kódu může být na Mono přenosný a testován na jednotkách pouhým použitím rozumných praktik a trochu prozíravosti. Zbytek (tj. Selhání testů jednotek) je pak specifický pro platformu (jako je kód používající PInvoke), ale měl by být dostatečně zapouzdřen, aby byl schopen poskytnout alternativní implementaci na cílenou platformu. Tímto způsobem, když se projekt nakonec dostane k portování, byla velká část práce provedena téměř bez nákladů a zbývající část se má rozvinout Just In Time.

Samozřejmě použití knihovny, která není k dispozici (.Net) nebo kompatibilní (třetí strana) v Mono, nic z toho vylučuje, ale v mém obor to ještě nebylo vidět. To je strategie, kterou skutečně používáme v práci, a při její aplikaci se nebojím tvrdit, že. Net + Mono je platforma napříč platformami.

1
Lloeki

To se liší, je čestná odpověď. Viděl jsem malé věci z webového serveru přesunuté z IIS) do Apache, běžící pod mono s téměř žádnými obtížemi. Úspěšně jsem spouští nezměněné aplikace Windows .Net pomocí Win Forms na Linuxu úspěšně.

Přestože to může fungovat, pokud používáte volání API, které není implementováno v mono, pak to nebude fungovat a jediným řešením je buď přepsat vaši aplikaci, držet se oken nebo napsat další věci v mono.

0
Michael Shaw