286

What is the difference between .NET Core and Mono?

I found a statement on the official site that said: "Code written for it is also portable across application stacks, such as Mono."

My goal is to use C#, LINQ, EF7 and Visual Studio to create a website that can be ran/hosted on Linux.

Someone told me that he wanted it to be "in Mono", but I don't know what that means. I know I want to use the .NET Core 1.0 with the technologies I listed above. He also said he wanted to use "fast CGI". I don't know what that means either.

Can you help me make sense of all these terms and if my expectations are realistic?

Palec
  • 10,298
  • 7
  • 52
  • 116
Captainlonate
  • 4,172
  • 2
  • 19
  • 33
  • 2
    I'm not sure .NET Core is supported on Mono (or if it even needs mono, now?), at least not entirely. Take a look [here](http://www.mono-project.com/docs/about-mono/compatibility/) for what Mono supports. FastCGI is simply the server that runs ASP.NET code with mono. Now, having said that, is there a particular reason you need to run it on Linux? If there's no pressing reason (other than just wanting to use linux), it's probably better to grab a windows server to run .NET code, at least for the time being. – Rob Jun 10 '16 at 00:17
  • Yes, the server it will be hosted on will definitely be linux. It's not an option to use windows server. You said you're not sure if .NET core is supported on Mono. but I don't know what Mono is. What would be an argument to use .Net Core instead of Mono? – Captainlonate Jun 10 '16 at 00:28
  • 12
    To be general about what mono is: it's essentially an open-source implementation of the .net libraries (plus compiles and interpreters). For example, when you write `Math.Pow(2, 3)` - the binaries which contain the implementation are closed-source and are *only* for windows. Some people decided they liked .NET enough that they wanted it for *nix. So they wrote their own version of the closed-source binaries. Then they wrote a compiler, and an interpreter. Mono is essentially a re-implementation of everything that was previously closed source, and written to run on windows/linux/osx. – Rob Jun 10 '16 at 00:34
  • 2
    I wrote a blog post last year, https://blog.lextudio.com/2015/12/jexus-web-server-and-asp-net-cross-platform/ You can use either one, but .NET Core is going to be the brighter future. – Lex Li Jun 10 '16 at 03:10
  • 3
    The word "Core" in ".NET Core" might be the source of misconception. Give your babies proper names! – The Shortest Mustache Theorem Jun 01 '18 at 20:18
  • 2020 - I found this source reliable at least on the part of Mono (It is still a separate stream apart from .NET Core / .NET5) https://www.mono-project.com/docs/about-mono/dotnet-integration/ – hB0 Sep 27 '20 at 09:18

9 Answers9

283

Necromancing.
Providing an actual answer.

What is the difference between .Net Core and Mono?

.NET Core now officially is the future of .NET. It started for most part with a re-write of the ASP.NET MVC framework and console applications, which of course includes server applications. (Since it's Turing-complete and supports interop with C dlls, you could, if you absolutely wanted to, also write your own desktop applications with it, for example through 3rd-party libraries like Avalonia, which were a bit very basic at the time I first wrote this, which meant you were pretty much limited to web or server stuff.) Over time, many APIs have been added to .NET Core, so much so that after version 3.1, .NET Core will jump to version 5.0, be known as .NET 5.0 without the "Core", and that then will be the future of the .NET Framework. What used to be the full .NET Framework will linger around in maintenance mode as Full .NET Framework 4.8.x for a few decades, until it will die (maybe there are still going to be some upgrades, but I doubt it). In other words, .NET Core is the future of .NET, and Full .NET Framework will go the way of the Dodo/Silverlight/WindowsPhone.

The main point of .NET Core, apart from multi-platform support, is to improve performance, and to enable "native compilation"/self-contained-deployment (so you don't need .NET framework/VM installed on the target machine.
On the one hand, this means docker.io support on Linux, and on the other, self-contained deployment is useful in "cloud-computing", since then you can just use whatever version of the dotnet-CORE framework you like, and you don't have to worry about which version(s) of the .NET framework the sysadmin has actually installed.

While the .NET Core runtime supports multiple operating systems and processors, the SDK is a different story. And while the SDK supports multiple OS, ARM support for the SDK is/was still work in progress. .NET Core is supported by Microsoft. Dotnet-Core did not come with WinForms or WPF or anything like that.

  • As of version 3.0, WinForms and WPF is also supported by .NET Core, but only on Windows, and only by C#. Not by VB.NET (VB.NET support planned for v5 in 2020). And there is no Forms Designer in .NET Core: it's being shipped with a Visual Studio update later, at an unspecified time.
  • WebForms are still not supported by .NET Core, and there are no plans to support them, ever (Blazor is the new kid in town for that).
  • .NET Core also comes with System.Runtime, which replaces mscorelib.
  • Oftentimes, .NET Core is mixed up with NetStandard, which is a bit of a wrapper around System.Runtime/mscorelib (and some others), that allows you to write libraries that target .NET Core, Full .NET Framework and Xamarin (iOS/Android), all at the same time.
  • the .NET Core SDK does not/did not work on ARM, at least not last time I checked.

"The Mono Project" is much older than .NET Core.
Mono is Spanish and means Monkey, and as a side-remark, the name has nothing to do with mononucleosis (hint: you could get a list of staff under http://primates.ximian.com/).
Mono was started in 2005 by Miguel de Icaza (the guy that started GNOME - and a few others) as an implementation of the .NET Framework for Linux (Ximian/SuSe/Novell). Mono includes Web-Forms, Winforms, MVC, Olive, and an IDE called MonoDevelop (also knows as Xamarin Studio or Visual Studio Mac). Basically the equivalent of (OpenJDK) JVM and (OpenJDK) JDK/JRE (as opposed to SUN/Oracle JDK). You can use it to get ASP.NET-WebForms + WinForms + ASP.NET-MVC applications to work on Linux.

Mono is supported by Xamarin (the new company name of what used to be Ximian, when they focused on the Mobile market, instead of the Linux market), and not by Microsoft.
(since Xamarin was bought by Microsoft, that's technically [but not culturally] Microsoft.)
You will usually get your C# stuff to compile on mono, but not the VB.NET stuff.
Mono misses some advanced features, like WSE/WCF and WebParts.
Many of the Mono implementations are incomplete (e.g. throw NotImplementedException in ECDSA encryption), buggy (e.g. ODBC/ADO.NET with Firebird), behave differently than on .NET (for example XML-serialization) or otherwise unstable (ASP.NET MVC) and unacceptably slow (Regex). On the upside, the Mono toolchain also works on ARM.

As far as .NET Core is concerned, when they say cross-platform, don't expect that cross-platform means that you could actually just apt-get install .NET Core on ARM-Linux, like you can with ElasticSearch. You'll have to compile the entire framework from source.
That is, if you have that space (e.g. on a Chromebook, which has a 16 to 32 GB total HD).
It also used to have issues of incompatibility with OpenSSL 1.1 and libcurl.
Those have been rectified in the latest version of .NET Core Version 2.2.
So much for cross-platform.

I found a statement on the official site that said, "Code written for it is also portable across application stacks, such as Mono".

As long as that code doesn't rely on WinAPI-calls, Windows-dll-pinvokes, COM-Components, a case-insensitive file system, the default-system-encoding (codepage) and doesn't have directory separator issues, that's correct. However, .NET Core code runs on .NET Core, and not on Mono. So mixing the two will be difficult. And since Mono is quite unstable and slow (for web applications), I wouldn't recommend it anyway. Try image-processing on .NET core, e.g. WebP or moving GIF or multipage-tiff or writing text on an image, you'll be nastily surprised.

Note:
As of .NET Core 2.0, there is System.Drawing.Common (NuGet), which contains most of the functionality of System.Drawing. It should be more or less feature-complete in .NET-Core 2.1. However, System.Drawing.Common uses GDI+, and therefore won't work on Azure (System.Drawing libraries are available in Azure Cloud Service [basically just a VM], but not in Azure Web App [basically shared hosting?])
So far, System.Drawing.Common works fine on Linux/Mac, but has issues on iOS/Android - if it works at all, there.
Prior to .NET Core 2.0, that is to say sometime mid-February 2017, you could use SkiaSharp for imaging (example) (you still can).
Post .net-core 2.0, you'll notice that SixLabors ImageSharp is the way to go, since System.Drawing is not necessarely secure, and has a lot of potential or real memory leaks, which is why you shouldn't use GDI in web-applications; Note that SkiaSharp is a lot faster than ImageSharp, because it uses native-libraries (which can also be a drawback). Also, note that while GDI+ works on Linux & Mac, that doesn't mean it works on iOS/Android.

Code not written for .NET (non-Core) is not portable to .NET Core.
Meaning, if you want a non-GPL C# library like PDFSharp to create PDF-documents (very commonplace), you're out of luck (at the moment) (not anymore). Never mind ReportViewer control, which uses Windows-pInvokes (to encrypt, create mcdf documents via COM, and to get font, character, kerning, font embedding information, measure strings and do line-breaking, and for actually drawing tiffs of acceptable quality), and doesn't even run on Mono on Linux
(I'm working on that).

Also, code written in .NET Core is not portable to Mono, because Mono lacks the .NET Core runtime libraries (so far).

My goal is to use C#, LINQ, EF7, visual studio to create a website that can be ran/hosted in linux.

EF in any version that I tried so far was so goddamn slow (even on such simple things like one table with one left-join), I wouldn't recommend it ever - not on Windows either.
I would particularly not recommend EF if you have a database with unique-constrains, or varbinary/filestream/hierarchyid columns. (Not for schema-update either.)
And also not in a situation where DB-performance is critical (say 10+ to 100+ concurrent users).
Also, running a website/web-application on Linux will sooner or later mean you'll have to debug it.
There is no debugging support for .NET Core on Linux. (Not anymore, but requires JetBrains Rider.)
MonoDevelop does not (yet) support debugging .NET Core projects.
If you have problems, you're on your own. You'll have to use extensive logging.
Be careful, be advised extensive logging will fill your disk in no time, particularly if your program enters an infinite loop or recursion.
This is especially dangerous if your web-app runs as root, because log-in requires logfile-space - if there's no free space left, you won't be able to login anymore.
(Normally, about 5% of diskspace is reserved for user root [aka administrator on Windows], so at least the administrator can still log in if the disk is almost full. But if your applications run as root, that restriction does not apply for their disk usage, and so their logfiles can use 100% of the remaining free space, so not even the administrator can log in any more.)
It's therefore better not to encrypt that disk, that is, if you value your data/system.

Someone told me that he wanted it to be "in Mono", but I don't know what that means.

It either means he doesn't want to use .NET Core, or he just wants to use C# on Linux/Mac. My guess is he just wants to use C# for a Web-App on Linux. .NET Core is the way to go for that, if you absolutely want to do it in C#. Don't go with "Mono proper"; on the surface, it would seem to work at first - but believe me you will regret it because Mono's ASP.NET MVC isn't stable when your server runs long-term (longer than 1 day) - you have now been warned. See also the "did not complete" references when measuring Mono performance on the techempower benchmarks.

fortunes

I know I want to use the .Net Core 1.0 framework with the technologies I listed above. He also said he wanted to use "fast cgi". I don't know what that means either.

It means he wants to use a high-performance full-featured WebServer like nginx (Engine-X), possibly Apache.
Then he can run mono/dotnetCore with virtual name based hosting (multiple domain names on the same IP) and/or load-balancing. He can also run other websites with other technologies, without requiring a different port-number on the web-server. It means your website runs on a fastcgi-server, and nginx forwards all web-requests for a certain domain via the fastcgi-protocol to that server. It also means your website runs in a fastcgi-pipeline, and you have to be careful what you do, e.g. you can't use HTTP 1.1 when transmitting files.
Otherwise, files will be garbled at the destination.
See also here and here.

To conclude:
.NET Core at present (2016-09-28) is not really portable, nor is is really cross-platform (in particular the debug-tools).
Nor is native-compilation easy, especially for ARM.
And to me, it also does not look like its development is "really finished", yet.
For example, System.Data.DataTable/DataAdaper.Update is missing... (not anymore with .NET Core 2.0)
Together with the System.Data.Common.IDB* interfaces. (not anymore with .NET Core 1.1)
if there ever was one class that is often used, DataTable/DataAdapter would be it...
Also, the Linux-installer (.deb) fails, at least on my machine, and I'm sure I'm not the only one that has that problem.
Debug, maybe with Visual Studio Code, if you can build it on ARM (I managed to do that - do NOT follow Scott Hanselman's blog-post if you do that - there's a howto in the wiki of VS-Code on github), because they don't offer the executable.
Yeoman also fails. (I guess it has something to do with the nodejs version you installed - VS Code requires one version, Yeoman another... but it should run on the same computer. pretty lame
Never mind that it should run on the node version shipped by default on the OS.
Never mind that there should be no dependency on NodeJS in the first place.
The kestell server is also work in progress.
And judging by my experience with the mono-project, I highly doubt they ever tested .NET Core on FastCGI, or that they have any idea what FastCGI-support means for their framework, let alone that they tested it to make sure "everything works". In fact, I just tried making a fastcgi-application with .NET Core and just realized there is no FastCGI library for .NET Core "RTM"...

So when you're going to run .NET Core "RTM" behind nginx, you can only do it by proxying requests to kestrell (that semi-finished nodeJS-derived web-server) - there's no fastcgi support at present in .NET Core "RTM", AFAIK. Since there is no .net core fastcgi library, and no samples, it's also highly unlikely that anybody did any testing on the framework to make sure fastcgi works as expected.

I also question the performance.
In the (preliminary) techempower-benchmark (round 13), aspnetcore-linux ranks on 25% relative to the best performance, while comparable frameworks like Go (golang) rank at 96.9% of peak performance (and that is when returning plaintext without file-system access only). .NET Core does a little better on JSON-serialization, but it does not look compelling either (go reaches 98.5% of peak, .NET core 65%). That said, it can't possibly be worse than "mono proper".

Also, since it's still relatively new, not all of the major libraries have been ported (yet), and I doubt that some of them will ever be ported.
Imaging support is also questionable at best.
For anything encryption, use BouncyCastle instead.

Can you help me make sense of all these terms and if my expectations are realistic?

I hope i helped you making more sense with all these terms.
As far as your expecations go:
Developing a Linux application without knowing anything about Linux is a really stupid idea in the first place, and it's also bound to fail in some horrible way one way or the other. That said, because Linux comes at no licensing costs, it's a good idea in principle, BUT ONLY IF YOU KNOW WHAT YOU DO.
Developing an application for a platform where you can't debug your application on is another really bad idea.
Developing for fastcgi without knowing what consequences there are is yet another really bad idea.

Doing all these things on a "experimental" platform without any knowledge of that platform's specifics and without debugging support is suicide, if your project is more than just a personal homepage. On the other hand, I guess doing it with your personal homepage for learning purposes would probably be a very good experience - then you get to know what the framework and what the non-framework problems are.
You can for example (programmatically) loop-mount a case-insensitive fat32, hfs or JFS for your application, to get around the case-sensitivity issues (loop-mount not recommended in production).

To summarize
At present (2016-09-28), I would stay away from .NET Core (for production usage). Maybe in one to two years, you can take another look, but probably not before.
If you have a new web-project that you develop, start it in .NET Core, not mono.

If you want a framework that works on Linux (x86/AMD64/ARMhf) and Windows and Mac, that has no dependencies, i.e. only static linking and no dependency on .NET, Java or Windows, use Golang instead. It's more mature, and its performance is proven (Baidu uses it with 1 million concurrent users), and golang has a significantly lower memory footprint. Also golang is in the repositories, the .deb installs without problems, the sourcecode compiles - without requiring changes - and golang (in the meantime) has debugging support with delve and JetBrains Gogland on Linux (and Windows and Mac). Golang's build process (and runtime) also doesn't depend on NodeJS, which is yet another plus.

As far as mono goes, stay away from it.
It is nothing short of amazing how far mono has come, but unfortunately that's no substitute for its performance/scalability and stability issues for production applications.
Also, mono-development is quite dead, they largely only develop the parts relevant to Android and iOS anymore, because that's where Xamarin makes their money.
Don't expect Web-Development to be a first-class Xamarin/mono citizen.
.NET Core might be worth it, if you start a new project, but for existing large web-forms projects, porting over is largely out of the question, the changes required are huge. If you have a MVC-project, the amount of changes might be manageable, if your original application design was sane, which is mostly not the case for most existing so-called "historically grown" applications.

December 2016 Update:
Native compilation has been removed from .NET Core preview, as it is not yet ready...

Seems like they have improved pretty heavily on the raw text-file benchmark, but on the other hand, it's gotten pretty buggy. Also, it further deteriorated in the JSON benchmarks. Curious also that entity framework shall be faster for updates than Dapper - although both at record slowness. This is very unlikely to be true. Looks like there still are more than just a few bugs to hunt.

Also, there seems to be relief coming on the Linux IDE front.
JetBrains released "Project Rider", an early access preview of a C#/.NET Core IDE for Linux (and Mac and Windows), that can handle Visual Studio Project files. Finally a C# IDE that is usable & that isn't slow as hell.

Conclusion: .NET Core still is pre-release quality software as we march into 2017. Port your libraries, but stay away from it for production usage, until framework quality stabilizes.
And keep an eye on Project Rider.

buggy .net core

2017 Update
Have migrated my (brother's) homepage to .NET Core for now.
So far, the runtime on Linux seems to be stable enough (at least for small projects) - it survived a load test with ease - mono never did.
Also, it looks like I mixed up .NET-Core-native and .NET-Core-self-contained-deployment. Self-contained deployment works, but it is a bit underdocumented, although it's super easy (the build/publish tools are a bit unstable, yet - if you encounter "Positive number required. - Build FAILED." - run the same command again, and it works).

You can run

dotnet restore -r win81-x64
dotnet build -r win81-x64
dotnet publish -f netcoreapp1.1 -c Release -r win81-x64

Note: As per .NET Core 3, you can publish everything minified as a single file:

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
dotnet publish -r linux-x64 -c Release /p:PublishSingleFile=true

However, unlike go, it's not a statically linked executable, but a self-extracting zip file, so when deploying, you might run into problems, especially if the temp directory is locked down by group policy, or some other issues. Works fine for a hello-world program, though. And if you don't minify, the executable size will clock in at something around 100 MB.

And you get a self-contained .exe-file (in the publish directory), which you can move to a Windows 8.1 machine without .NET framework installed and let it run. Nice. It's here that dotNET-Core just starts to get interesting. (mind the gaps, SkiaSharp doesn't work on Windows 8.1 / Windows Server 2012 R2, [yet] - the ecosystem has to catch up first - but interestingly, the Skia-dll-load-fail doesn't crash the entire server/application - so everything else works)

(Note: SkiaSharp on Windows 8.1 is missing the appropriate VC runtime files - msvcp140.dll and vcruntime140.dll. Copy them into the publish-directory, and Skia will work on Windows 8.1.)

August 2017 Update
.NET Core 2.0 released.
Be careful - comes with (huge breaking) changes in authentication...
On the upside, it brought the DataTable/DataAdaper/DataSet classes back, and many more.
Realized .NET Core is still missing support for Apache SparkSQL, because Mobius isn't yet ported. That's bad, because that means no SparkSQL support for my IoT Cassandra Cluster, so no joins...
Experimental ARM support (runtime only, not SDK - too bad for devwork on my Chromebook - looking forward to 2.1 or 3.0).
PdfSharp is now experimentally ported to .NET Core.
JetBrains Rider left EAP. You can now use it to develop & debug .NET Core on Linux - though so far only .NET Core 1.1 until the update for .NET Core 2.0 support goes live.

May 2018 Update
.NET Core 2.1 release imminent. Maybe this will fix NTLM-authentication on Linux (NTLM authentication doesn't work on Linux {and possibly Mac} in .NET-Core 2.0 with multiple authenticate headers, such as negotiate, commonly sent with ms-exchange, and they're apparently only fixing it in v2.1, no bugfix release for 2.0).
But I'm not installing preview releases on my machine. So waiting.
v2.1 is also said to greatly reduce compile times. That would be good.

Also, note that on Linux, .NET Core is 64-Bit only !
There is no, and there will be no, x86-32 version of .NET Core on Linux.
And the ARM port is ARM-32 only. No ARM-64, yet.
And on ARM, you (at present) only have the runtime, not the dotnet-SDK.

And one more thing:
Because .NET-Core uses OpenSSL 1.0, .NET Core on Linux doesn't run on Arch Linux, and by derivation not on Manjaro (the most popular Linux distro by far at this point in time), because Arch Linux uses OpenSSL 1.1. So if you're using Arch Linux, you're out of luck (with Gentoo, too).

Edit:

Latest version of .NET Core 2.2+ supports OpenSSL 1.1. So you can use it on Arch or (k)Ubuntu 19.04+. You might have to use the .NET-Core install script though, because there are no packages, yet.

On the upside, performance has definitely improved: fortunes

plaintext

.NET Core 3:
.NET-Core v 3.0 is said to bring WinForms and WPF to .NET-Core.
However, while WinForms and WPF will be .NET Core, WinForms and WPF in .NET-Core will run on Windows only, because WinForms/WPF will use the Windows-API.

Note:
.NET Core 3.0 is now out (RTM), and there is WinForms and WPF support, but only for C# (on Windows). There is no WinForms-Core-Designer. The designer will, eventually, come with a Visual Studio update, somewhen. WinForms support for VB.NET is not supported, but is planned for .NET 5.0 somewhen in 2020.

PS:

echo "DOTNET_CLI_TELEMETRY_OPTOUT=1" >> /etc/environment
export DOTNET_CLI_TELEMETRY_OPTOUT=1 

If you've used it on windows, you probably never saw this:

The .NET Core tools collect usage data in order to improve your experience.
The data is anonymous and does not include command-line arguments.
The data is collected by Microsoft and shared with the community.
You can opt out of telemetry by setting a DOTNET_CLI_TELEMETRY_OPTOUT environment variable to 1 using your favorite shell.
You can read more about .NET Core tools telemetry @ https://aka.ms/dotnet-cli-telemetry.

I thought I'd mention that I think monodevelop (aka Xamarin Studio, the Mono IDE, or Visual Studio Mac as it is now called on Mac) has evolved quite nicely, and is - in the meantime - largely usable.
However, JetBrains Rider (2018 EAP at this point in time) is definitely a lot nicer and more reliable (and the included decompiler is a life-safer), that is to say, if you develop .NET-Core on Linux or Mac. MonoDevelop does not support Debug-StepThrough on Linux in .NET Core, though, since MS does not license their debugging API dll (except for VisualStudio Mac ... ). However, you can use the Samsung debugger for .NET Core through the .NET Core debugger extension for Samsung Debugger for MonoDevelop

Disclaimer:
I don't use Mac, so I can't say if what I wrote here applies to FreeBSD-Unix based Mac as well. I am refering to the Linux (Debian/Ubuntu/Mint) version of JetBrains Rider, mono, MonoDevelop/VisualStudioMac/XamarinStudio and .NET-Core. Also, Apple is contemplating a move from Intel-processors to self-manufactured ARM(ARM-64?)-based processors, so much of what applies to Mac right now might not apply to Mac in the future (2020+).

Also, when I write "mono is quite unstable and slow", the unstable relates to WinFroms & WebForms applications, specifically executing web-applications via fastcgi or with XSP (on the 4.x version of mono), as well as XML-serialization-handling peculiarities, and the quite-slow relates to WinForms, and regular expressions in particular (ASP.NET-MVC uses regular expressions for routing as well).

When I write about my experience about mono 2.x, 3.x and 4.x, that also does not necessarely mean these issues haven't been resolved by now, or by the time you are reading this, nor that if they are fixed now, that there can't be a regression later that reintroduces any of these bugs/features. Nor does that mean that if you embed the mono-runtime, you'll get the same results as when you use the (dev) system's mono runtime. It also doesn't mean that embedding the mono-runtime (anywhere) is necessarely free.

All that doesn't necessarely mean mono is ill-suited for iOS or Android, or that it has the same issues there. I don't use mono on Android or IOS, so I'm in no positon to say anything about stability, usability, costs and performance on these platforms. Obviously, if you use .NET on Android, you have some other costs considerations to do as well, such as weighting xamarin-costs vs. costs and time for porting existing code to Java. One hears mono on Android and IOS shall be quite good. Take it with a grain of salt. For one, don't expect the default-system-encoding to be the same on android/ios vs. Windows, and don't expect the android filesystem to be case-insensitive, and don't expect any windows fonts to be present.

Stefan Steiger
  • 68,404
  • 63
  • 337
  • 408
  • 1
    System.Data.DataTable should be missing, it's horrible. It encourages people to build stored procedures that return multiple datasets and or tables. The only thing you really need is SqlDataReader, it's the fastest of the lot. I mean I know it's a migration blocker, but code bases that return stuff 100 different ways in SP's that would make DT's even needed is a nightmare.... I can't think of a solid good reason why DataTable and DataSet should exist. Imo though, we shouldn't really be expecting 100% migration with .net core, it's a whole new world. That's why full version still exists. – Ryan Mann Oct 31 '16 at 18:08
  • @Ryan Mann: Yea, I fully agree with you in principle. By the way, you can loop through multiple tables/dataset with SqlDataReader - no problem, just a tiny little bit more complicated. However, the issue is "legacy applications". For example, many of the legacy applications I have to look after have System.Data.DataTable all over the place, with functions returning tables, just so the table can be serialized into JSON, or databound to a WebForms table or chart. Very horrible, but very real. Then changing one function means replacing all occurences in multiple projects. Horrible. – Stefan Steiger Nov 01 '16 at 14:39
  • @Ryan Mann: You can't even migrate junks of code that way. Also, even reuse is difficult, as code is often times accessing data over indices, in the DataBound-event, etc. Moreover, missing DataTable support means a function can't even return a data-table, and changing a function's signature breaks a lot of interfaces... Also, all code with dataadapter-insert/update(table) breakes. Unfortunately, the code I have to maintain heavily depends on these horrible things. You can't fix 10 years of mistakes in a day, or even a month. Although getting rid of these horrible things is good, in principle. – Stefan Steiger Nov 01 '16 at 14:45
  • 1
    Yeah, but if you can't fix them in a day, use 4.6 and don't target core. Core isn't really ".Net Framework" it's such a different beast of an animal, I think it's pretty unnecessary to expect all old .Net code to migrate to it. Microsoft is still maintaining the full .Net Framework on Windows, and developing new versions of it. .Net Core should be a fresh start, where we drop out all the bad parts of the framework to support solid new code bases, in my opinion. I deal with the same kind of code bases, we are staying on 4.6 and doing new work on Core and will eventually rewrite. – Ryan Mann Nov 01 '16 at 17:17
  • There's no reason to migrate an old legacy app to .net core except for performance or to free up windows licensing fees.... You can just leave it on .Net 4.6 (or w/e the latest full framework is). Especially if it's web forms, web forms isn't in .Net Core either, and it's not going to be from what I've read. Web Forms wise, it will still be in 4.x going forward, (4.6 etc), but it's not coming to .Net Core. Now if Licensing is a mover to migrate, I would argue that it costs more in dev hours migrating and setting up Linux servers than you spent on the windows license. – Ryan Mann Nov 01 '16 at 17:24
  • 1
    @Ryan Mann: True, all good arguments. However, re-writing entire applications is economically unsound and unrealistic. If I'd be re-writing, I'd move away from .NET entirely and towards Google-go while I was at it. Dead if you port, dead if you don't. Vendor-lock-in at its finest. – Stefan Steiger Nov 23 '16 at 10:21
  • 2
    @Asimov: Depends on what you compare it to; compared to IIS, it is. Apache's performance is actually quite good - it's the resource consumption (and ease of configuration) that is much worse than nginx. Apache is thus not a low-TCO server. Consequentially, Apache is less used in high-traffic high-volume websites. But it's still a very common server platform, that has a high-performance as well - it's effective, just not very efficient. What you actually mean is that Apache is not suitable for high-volume high-traffic websites. But that is not the same as not a high-performance webserver. – Stefan Steiger Jan 04 '17 at 10:27
  • 6
    @Tseng: Ah yes it is bs ? Have you seen Winforms Core, or WPF Core then ? Yes, technically it is a multi-platform port of the .NET Framework and has nothing to do with MVC. But Web-Applications (ASP.NET MVC) and console applications are the only thing you can do with .NET Core at the moment... And yes MVC, because the is no WebForms Core. That's what it is at the moment, plain and simple. But true, you don't have to use MVC in your web-applications just because you use .NET Core. You can also make a web-application without MVC. But SEO-wise, it would make little sense to do so. – Stefan Steiger Feb 17 '17 at 07:53
  • @StefanSteiger:You can write any server sided application with .NET Core (i.e. Orleans silos with Orleans 2.0).Its neither a console application nor it's an Web application, it's a server application. And WPF runs on .NET Core,if you'd now a little more about .NET Core. Since .NET Core runs on System.Runtime and Windows Store Apps/UWP also runs on it, which makes the UWP Apps (which use a subset of WPF/XAML) also run on .NET Core.Just not on Linux/Mac, because UWP/Windows store apps are, as the name says tied to Windows Eco system,hence has native dependencies.Fact remains,it runs on .NET Core – Tseng Feb 17 '17 at 08:12
  • @Tseng: What sense does it make to run WPF/Windows Phone apps on .NET Core on Windows ? Maybe if you need it to run on ARM, but .NET Core has no ARM release so far, yet. Also, server applications are console-applications, at least for me, just with a multi-threaded redirected stdin&stdout. At present, for Linux, it's only for web & console applications. Windows Phone is irrelevant BTW, and so is .NET Core on Windows. Seen your way, if you can do a console-application, you can do anything, like a Linux-GUI application. That's true, but just to what extent and with how much expenditure... – Stefan Steiger Feb 17 '17 at 09:19
  • With this argumentation, desktop applications are console applications to which use a UI framework... After all, it's same bootstrap code (Main method), the only difference is a flag in PE header which decides if console gets displayed or not... D'oh! And ASP.NET core would be an console application too then. Anything that doesn't run to execute a single operation and then quits doesn't qualify for a console application imho. Everything that runs permanently until shutdown is classified as server application – Tseng Feb 17 '17 at 09:42
  • Also .NET Core on Windows isn't irrelevant. You still get all the benefits of .NET Core + better performance when run on windows and you can utilize docker containers which do not run on linux (Nano server or Windows Server). – Tseng Feb 17 '17 at 09:46
  • @Tseng: Yes, IMHO, it's (more or less) true that a desktop application is nothing more than a console application with UI framework (and - on windows - with different PE header & sta-thread-mode). After all, the additional work is done by the window-manager, not the application. On Linux, it doesn't even differ on the elf header, I think. And if you go into an ASP.NET Core MVC application, it will show "console application", in the project properties "output type" - so yes, that's a console application, too, by that definition - seems even MS devs think that way, if they label it like that. – Stefan Steiger Feb 21 '17 at 10:29
  • 18
    Saying Mono is "quite unstable and slow" is unfounded, if not plain wrong. But apart from that, good info here. – Noldorin Apr 17 '17 at 15:54
  • @Noldorin: Well, depends on your point of view. Mono the dotnet-VM itselfs perhaps not - but ASP.NET MVC/xsp/mono-service/class-libraries/fastcgi on mono, yes. A simple homepage on mvc3 on mono never ran longer than 1 day before it gave "compilation error" for no apparent reason. Interestingly, lumisoft-mail-server ran fine long-term, when running as daemon-console-application (though it crashed when run with mono-service pretty much every 6 hours). Interestingly, on techempower round 14, aspnet-mvc-mono runs faster than .NET Core... – Stefan Steiger Apr 20 '17 at 13:17
  • @StefanSteiger Mever used ASP.NET specifically on Mono, but I'll take your word on that. I was just thinking if the compilers and runtime really. – Noldorin Apr 20 '17 at 20:47
  • 72
    This answer is heavily opinionated and contains many point-in-time references. – Caleb Aug 01 '17 at 13:01
  • 4
    Agree on opinionated. Good to get some info on Mono/Core, but have to take it with pinch of salt from someone who says EF is inefficient but likes to use DataTable - v strange. Also "stay away from mono" sounds absurd. The key to being taken seriously is to use appropriate qualifiers: e.g. for the specific tech stack [insert here] mono has provided these specific issues [insert here]. In my tech stack (iOS and Android), Mono has been amazing. – user603563 Aug 24 '17 at 06:19
  • 1
    @ user603563: Fair point with opinionated - I'm not a journalist, I write of my own experiences - I'm not extensively researching every detail. Sure .NET on iOS/Android isn't the same as on the web - but I don't need .NET to write Android applications. As to DataTable usage: You can save a lot of programming if you just do DataAdapter.Update with DbCommandBuilder. Usually entity-slowness revolves around performance of select-queries with large schemata, startup-slowness, a dozen left/full/lateral joins, problems in handling array-parameters, filestream, or recursive-queries. – Stefan Steiger Aug 24 '17 at 13:36
  • @user603563: Sure if you first load all data into memory in a DataTable, just to serialize it to JSON when you should just output JSON in an AJAX-endpoint, then it's inefficient. But the funny thing is, even if you add all that overhead, you're often times still faster than when using entity-framework. Also, a slow startup-time is not acceptable. Not just in production, but also because of debugging and developing. Don't want to have to wait a minute to three just for entity to start up when I want to test something again and again and again. Also, ORM is a hopeless endeavor. – Stefan Steiger Aug 24 '17 at 13:49
  • @user603563: All I would want is compile-time SQL schema-checking (against multiple schema in one application). I don't really need an ORM for that. Also useful would be compile-time SQL-generation for a specific database. But at compile-time, not at runtime. Entity at best offers type-safety for trivial queries. Dapper already offers that - without all the overhead. Also EF is too dependent on LINQ - which looks like it is similar to SQL - but then in actuality, it isn't. That's counterproductive because a pointless learning-curve is not in anybody's interest,esp. if it doesn't add any value. – Stefan Steiger Aug 24 '17 at 14:02
  • 2
    This answer made me feel sick – Eric Liu Nov 03 '17 at 19:23
  • 24
    It pains me to see the first sentence of this highly-scored answer be so blatantly wrong. .NET Core is *not* a re-write of the ASP.NET MVC framework. – JHo Nov 16 '17 at 18:10
  • 1
    @JHo: Again, it clearly says "for most part". I'm well aware that it's not just a MVC framework, but a cross-platform .NET Framework. But again, try doing WinForms with it, or WebForms, or WCF, or WPF or.... And you will quickly realize that Web-Applications (without web-forms) and console-applications/servers are the only thing you can do with it currently. That's what it is RIGHT NOW (and most definitely in versions < 2.0) - and if you don't like that, or refuse to believe it, that's not my problem. There's no PRODUCTION GRADE desktop-app framework for it. And no reporting tools whatsoever. – Stefan Steiger Nov 17 '17 at 06:57
  • 6
    @stefan-steiger Even saying "for most part" is completely wrong and not at all the purpose of .NET Core. "Again"? Instead of repeating yourself, why don't you change it? – JHo Nov 19 '17 at 16:29
  • 1
    @JHo: Depends on your point of view. Only with V3 will it have WinForms/WPF, and then, only on Windows, so then, technically, .NET-Core will be cross-platform no longer (well ok, not .net itselfs, but the used libraries) . By then, it will degrade to "just a performance-oriented rewrite of the .NET framework", which IMHO is even worse. Ironically, not that having WPF on .NET Core would not necessarely be a bad thing, though - in theory. – Stefan Steiger Jun 06 '18 at 13:12
  • 2
    There is so much wrong with this answer it isn't even funny. And that's not even counting all of the errors in the comments that follow. Wow. – McGuireV10 Aug 11 '18 at 16:02
  • 2
    @McGuireV10: Yea yea, so much wrong - I've heard that before - and just like the "windows phone is dead" comment, it doesn't even talk nicely about Microsoft. But you know what ? That's because I'm not living in the greater Seattle area near Redmond, and neither do I have any intention or ambition of moving there, which is why I can afford myself the luxury of speaking the MY opinion. If you feel mine is wrong, hit the answer button and answer the question yourselfs. I'm gonna read it for sure. But bring arguments, not polemic. – Stefan Steiger Aug 11 '18 at 23:12
  • Can you elaborate on this one: `since Xamarin was bought by Microsoft, that's technically, but not really, Microsoft`? I mean, technically, it would make sense: Mono can be used on Windows either, so focusing on Mono would improve maintainability. – Hi-Angel Aug 30 '18 at 10:04
  • 2
    @Hi-Angel: The culture is very different. With Xamarin, you ask a question - you get an answer the next day. With Microsoft, if you can manage to ask a question, you get a closed as by design within a decade. Any problem will be addressed after that decade. Also, Xamarin has limited resources - it's not like the .NET team now works on mono. – Stefan Steiger Aug 30 '18 at 11:48
  • That's the only information I found about the usability of .NET Core 2 on Linux. Currently I'm running MONO on my Debian Linux server. Based on your experience, would you say it's a smart move to move to .NET Core 2.2 / 3.0 for a small websites production server? – Etienne Charland Mar 01 '19 at 14:02
  • @Etienne Charland: You can use it. However, check if it's running properly after a few days. There were issues with MailKit certificate caching on my machine after some time. The issue was that the cache directory was missing... I'd use 2.2 right now, and 3 when it is RTM. Everything else is bullocks, unfortunately. Note: Absolutely do use self-contained deployment on a production server. Required native libraries may be missing in a minimal docker container, so check the dependencies. If you use VB.NET, go for the 3.0 version, even pre-RTM. Document any issues you find and solve ! – Stefan Steiger Mar 01 '19 at 14:53
  • @Etienne Charland: It may run initially, and then fail later. Use uptimerobot to check state all 5 minutes. Also, run a free load-test, to see if there are any issues. – Stefan Steiger Mar 01 '19 at 14:55
  • I had issues with MONO where it would stop responding after a few days. I ended "fixing" it by running it in FastCGI mode and restarting the websites once a day. If .NET Core can lead into such hassles I'd rather focus my time elsewhere. If it saves time I'd look into it. – Etienne Charland Mar 01 '19 at 15:07
  • @Etienne Charland: I had the same problems with mono. No, I haven't had that kind of problem with .NET Core. After the missing directory for SSL-certificate caching was created, the entire application run just fine for an entire year. 100% uptime. – Stefan Steiger Mar 01 '19 at 15:45
  • And then it avoids all kinds of "subtle differences" with MONO that need to be taken care of. Now I'm reading .NET Core does NOT support WebForms? That means my websites would need to be rewritten -- luckily they're mostly masterpage layouts with almost no code in it, but rewriting it still won't be done overnight. – Etienne Charland Mar 01 '19 at 16:27
  • @Etienne Charland: Yep that is true. Web-Forms has been inofficially deprecated for a long time, but now it's official. But you'd probably have to change some things anyway. You'll also need to change to Razor. Note: no ReportViewer in .NET Core (on Linux). – Stefan Steiger Mar 01 '19 at 16:59
  • Oh, I'd have to redo a long grid with sorting manually... perhaps that's the best place to start learning the new Razor stuff, porting the old one over. As I'm reading about MVC, it also seems people (even Microsoft) are recommending Razor pages instead -- so that saves me of learning the more complex MVC structures. – Etienne Charland Mar 01 '19 at 17:25
  • Thanks. Whereas, I can't fully grasp every details of this answer, but it's one of those exceptional cases where opinion matters because a direct explanation could be impossible given the blur and moving targets. – eigenfield Jan 22 '21 at 17:25
  • 1
    Wow, this is the longest answer I've ever seen on this website. It could really benefit from some slimming. – forresthopkinsa Feb 01 '21 at 20:00
  • This answer deserves its own blog entry. – R. Dinanjanan Apr 24 '21 at 12:47
  • @R. Dinanjanan: Yea, especially now that .NET 6 is coming and 3.0 is way out of date. Lots of changes since. – Stefan Steiger Apr 26 '21 at 14:15
  • We need the 2020 update, please! – Samo May 05 '21 at 16:06
54

In the .NET world there are two types of CLRs, "full" CLRs and Core CLRs, and these are quite different things.

There are two "full" CLR implementations, the Microsoft native .NET CLR (for Windows) and the Mono CLR (which itself has implementations for Windows, linux and unix (Mac OS X and FreeBSD)). A full CLR is exactly that - everything, pretty much, that you need. As such, "full" CLRs tend to be large in size.

Core CLRs are on the other hand are cut down, and much smaller. Because they are only a core implementation, they are unlikely to have everything you need in them, so with Core CLRs you add feature sets to the CLR that your specific software product uses, using NuGet. There are Core CLR implementations for Windows, linux (various) and unix (Mac OS X and FreeBSD) in the mix. Microsoft have or are refactoring the .NET framework libraries for Core CLR too, to make them more portable for the core context. Given mono's presence on *nix OSs it would be a surprise if the Core CLRs for *nix did not include some mono code base, but only the Mono community and Microsoft could tell us that for sure.

Also, I'd concur with Nico in that Core CLRs are new -- it's at RC2 at the moment I think. I wouldn't depend on it for production code yet.

To answer your question you could delivery your site on linux using Core CLR or Mono, and these are two different ways of doing it. If you want a safe bet right now I'd go with mono on linux, then port if you want to later, to Core.

muszeo
  • 2,127
  • 7
  • 11
  • 2
    I would not go in Mono knowing that it is not a permanent host for my production web application, especially knowing from the beginning that it would cost me additional effort porting it to Core! – Panayiotis Hiripis Aug 05 '17 at 06:47
  • @Panayiotis Hiripis: Debugging mono behaviour deviations, dealing with unstable mono web-servers and not-implemented exceptions, as well as outage-costs when an unstable mono-server crashes, will also cost you - and probably far more than porting to .NET Core. If I spend time, I would much rather spend the time updating to newer, faster, better designed versions, rather than fixing bugs in old versions and maintaining a project with legacy technology. Move in time will save you a lot of headache later. At some point in time, you'll have to port anyway... TheSoonerYouMove, theLessYouPort later. – Stefan Steiger Sep 20 '17 at 11:32
  • It's worth noting the merry-go-round that is linked library mgt. At one time (not that long ago!) we had this thing called DLL hell. It occurred because multiple copies of dlls (sometimes different versions) were released with different applications. Java still has this problem. Microsoft tried to solve this with the COM registry and later the .NET GAC. .NET Core reintroduces it. One day we'll all spin around -- after a few years of mucking around with dlls and deployments we'll again come up with: a registry. NuGet, Maven, Gradle - these are just ways to manage rather than resolve. – muszeo Oct 30 '18 at 01:38
14

You have chosen not only a realistic path, but arguably one of the best ecosystems strongly backed(also X-platforms) by MS. Still you should consider following points:

  • Update: Main doc about .Net platform standard is here: https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md
  • Update: Current Mono 4.4.1 cannot run latest Asp.Net core 1.0 RTM
  • Although mono is more feature complete, its future is unclear, because MS owns it for some months now and its a duplicate work for them to support it. But MS is definitely committed to .Net Core and betting big on it.
  • Although .Net core is released, the 3rd party ecosystem is not quite there. For example Nhibernate, Umbraco etc cannot run over .Net core yet. But they have a plan.
  • There are some features missing in .Net Core like System.Drawing, you should look for 3rd party libraries
  • You should use nginx as front server with kestrelserver for asp.net apps, because kestrelserver is not quite ready for production. For example HTTP/2 is not implemented.

I hope it helps

Otabek Kholikov
  • 1,058
  • 11
  • 18
  • There is a webserver called [`jexus`](https://en.wikipedia.org/wiki/Jexus) that can host ASP.NET website on linux. My personal site is written with NancyFx (originally ASP.NET MVC4) runs on it. – zwcloud Nov 01 '16 at 07:59
  • The second bullet is incorrect. I am currently shipping an ASP.NET Core 1.0 application on Mono 4.4.0 and have been since about beta8. – Ben Collins Nov 21 '16 at 18:30
  • @zwcloud: Why not just use mono.xsp4 /4.5 with nginx ? There's really no need for jexus. – Stefan Steiger Dec 19 '16 at 09:51
10

.Net Core does not require mono in the sense of the mono framework. .Net Core is a framework that will work on multiple platforms including Linux. Reference https://dotnet.github.io/.

However the .Net core can use the mono framework. Reference https://docs.asp.net/en/1.0.0-rc1/getting-started/choosing-the-right-dotnet.html (note rc1 documentatiopn no rc2 available), however mono is not a Microsoft supported framework and would recommend using a supported framework

Now entity framework 7 is now called Entity Framework Core and is available on multiple platforms including Linux. Reference https://github.com/aspnet/EntityFramework (review the road map)

I am currently using both of these frameworks however you must understand that it is still in release candidate stage (RC2 is the current version) and over the beta & release candidates there have been massive changes that usually end up with you scratching your head.

Here is a tutorial on how to install MVC .Net Core into Linux. https://docs.asp.net/en/1.0.0-rc1/getting-started/installing-on-linux.html

Finally you have a choice of Web Servers (where I am assuming the fast cgi reference came from) to host your application on Linux. Here is a reference point for installing to a Linux enviroment. https://docs.asp.net/en/1.0.0-rc1/publishing/linuxproduction.html

I realise this post ends up being mostly links to documentation but at this point those are your best sources of information. .Net core is still relatively new in the .Net community and until its fully released I would be hesitant to use it in a product environment given the breaking changes between released version.

Nico
  • 12,043
  • 5
  • 38
  • 60
  • 6
    Microsoft now owns Xamarin, which develops mono. So both mono and .Net Core are supported by MS. – Joel Coehoorn Jun 10 '16 at 01:34
  • @JoelCoehoorn I understand that Microsoft owns Xamarin however dont know about Xamarin owning Mono. However from the docs https://docs.asp.net/en/1.0.0-rc1/getting-started/choosing-the-right-dotnet.html#id1 does state it is not supported. *Mono is not a platform supported by Microsoft; however, it is a good proving ground for cross-platform development while cross-platform support in .NET Core matures.* Now this may be wrong or out of date. – Nico Jun 10 '16 at 02:13
  • @Nico at RC1 time, Xamarin was not yet acquired by Microsoft. You can check the timeline for more details, http://corefx.strikingly.com – Lex Li Jun 10 '16 at 03:08
  • Mono isn't supported by Microsoft. MS supports Xamarin organization, but they don't do anything for the Mono project. – Kotauskas Jul 21 '18 at 13:31
8

This question is especially actual because yesterday Microsoft officially announced .NET Core 1.0 release. Assuming that Mono implements most of the standard .NET libraries, the difference between Mono and .NET core can be seen through the difference between .NET Framework and .NET Core:

  • APIs — .NET Core contains many of the same, but fewer, APIs as the .NET Framework, and with a different factoring (assembly names are
    different; type shape differs in key cases). These differences
    currently typically require changes to port source to .NET Core. .NET Core implements the .NET Standard Library API, which will grow to
    include more of the .NET Framework BCL APIs over time.
  • Subsystems — .NET Core implements a subset of the subsystems in the .NET Framework, with the goal of a simpler implementation and
    programming model. For example, Code Access Security (CAS) is not
    supported, while reflection is supported.

If you need to launch something quickly, go with Mono because it is currently (June 2016) more mature product, but if you are building a long-term website, I would suggest .NET Core. It is officially supported by Microsoft and the difference in supported APIs will probably disappear soon, taking into account the effort that Microsoft puts in the development of .NET Core.

My goal is to use C#, LINQ, EF7, visual studio to create a website that can be ran/hosted in linux.

Linq and Entity framework are included in .NET Core, so you are safe to take a shot.

Miljen Mikic
  • 13,521
  • 5
  • 51
  • 59
7

To be simple,

Mono is third party implementation of .Net framework for Linux/Android/iOs

.Net Core is microsoft's own implementation for same.

.Net Core is future. and Mono will be dead eventually. Having said that .Net Core is not matured enough. I was struggling to implement it with IBM Bluemix and later dropped the idea. Down the time (may be 1-2 years), it should be better.

Thakur
  • 491
  • 6
  • 12
  • 8
    This doesn't seem to be the case, but rather you are stating assumptions/opinions Officially this is the future of mono: http://www.mono-project.com/news/2016/11/29/mono-code-sharing/ It seems as though they will maintain as .net core is just that "core" a subset of the full framework and mono will still be the only cross-platform framework, although with .net standard code can be shared with mono and the full .net framework (and other .net implementations too like .net core of course) – pqsk Apr 12 '17 at 16:28
5

This is no more .NET Core vs. Mono. It's unified.

Update as of November 2020 - .NET 5 released that unifies .NET Framework and .NET Core

.NET and Mono will be unified under .NET 6 that would be released in November 2021

  • .NET 6.0 will add net6.0-ios and net6.0-android.
  • The OS-specific names can include OS version numbers, like net6.0-ios14.

Check below articles:

Manish Jain
  • 8,990
  • 5
  • 35
  • 39
1

This is one of my favorite topics and the content here was just amazing. I was thinking if it would be worth while or effective to compare the methods available in Runtime vs. Mono. I hope I got my terms right, but I think you know what I mean. In order to have a somewhat better understanding of what each Runtime supports currently, would it make sense to compare the methods they provide? I realize implementations may vary, and I have not considered the Framework Class libraries or the slew of other libraries available in one environment vs. the other. I also realize someone might have already done this work even more efficiently. I would be most grateful if you would let me know so I can review it. I feel doing a diff between the outcome of such activity would be of value, and wanted to see how more experienced developers feel about it, and would they provide useful guidance. While back I was playing with reflection, and wrote some lines that traverse the .net directory, and list the assemblies.

Shahin
  • 61
  • 6
-15

In a nutshell:

Mono = Compiler for C#

Mono Develop = Compiler+IDE

.Net Core = ASP Compiler

Current case for .Net Core is web only as soon as it adopts some open winform standard and wider language adoption, it could finally be the Microsoft killer dev powerhouse. Considering Oracle's recent Java licensing move, Microsoft have a huge time to shine.