{"id":13475,"date":"2015-02-19T14:33:34","date_gmt":"2015-02-19T13:33:34","guid":{"rendered":"https:\/\/blog.trifork.com\/?p=13475"},"modified":"2015-02-19T14:33:34","modified_gmt":"2015-02-19T13:33:34","slug":"developing-dotnet-software-on-linux-with-mono","status":"publish","type":"post","link":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/","title":{"rendered":"Developing .NET software on Linux with Mono"},"content":{"rendered":"<h2>The motivation<\/h2>\n<p>The obvious question here is why would you want to develop .NET software on Linux or for Linux? At the risk of sounding like throwing buzzwords around, I will say it is because Linux dominates the cloud completely. Many cloud-related technologies such as <a title=\"Docker\" href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a>, <a title=\"Mesos\" href=\"http:\/\/mesos.apache.org\/\" target=\"_blank\" rel=\"noopener\">Mesos<\/a>, and others build on Linux as a base. Sure, it is possible to run Windows in the cloud one way or another, but it is really hard to match the flexibility of Linux, especially when running more than just a few instances.<\/p>\n<p>Quite recently Microsoft announced <a title=\"open-sourcing of .NET Core\" href=\"http:\/\/blogs.msdn.com\/b\/dotnet\/archive\/2014\/11\/12\/net-core-is-open-source.aspx\" target=\"_blank\" rel=\"noopener\">open-sourcing of .NET Core<\/a> paving new grounds for a truly cross-platform .NET implementation. It has already been possible to run a lot of .NET software on Linux and OSX for quite some time on an independent .NET implementation called <a title=\"Mono\" href=\"http:\/\/www.mono-project.com\/\" target=\"_blank\" rel=\"noopener\">Mono<\/a>, and now Microsoft is saying that they will work <em>with<\/em> the Mono project on a common code base that will eventually become <em>the<\/em> .NET core. In fact, <a title=\"Microsoft and Xamarin Expand Global Partnership\" href=\"http:\/\/blog.xamarin.com\/microsoft-and-xamarin-expand-global-partnership\/\" target=\"_blank\" rel=\"noopener\">Microsoft has been close to Xamarin<\/a>, a company behind Mono, for a while now, so this step is not that surprising.<\/p>\n<p>But how usable is Mono right now? That is what I set out to find out in my little experiment.<!--more--><\/p>\n<h2>Installing Mono<\/h2>\n<p>In a few words Mono is a <q>cross platform, open source .NET framework<\/q> which supports&nbsp;<q>everything in .NET 4.5 except <abbr title=\"Windows Presentation Foundation\">WPF<\/abbr>, <abbr title=\"Windows Workflow Foundation\">WWF<\/abbr>, and with limited <abbr title=\"Windows Communication Foundation\">WCF<\/abbr> and limited&nbsp;<a title=\"Mono ASP.NET\" href=\"http:\/\/www.mono-project.com\/docs\/web\/aspnet\/\" target=\"_blank\" rel=\"noopener\">ASP.NET<\/a> 4.5 async stack.<\/q> It is important to note that Mono version numbers do not reflect Microsoft .NET versions in any way, so it is a good idea to take a look at the <a title=\"Mono compatibility\" href=\"\/\/www.mono-project.com\/docs\/about-mono\/compatibility\/\" target=\"_blank\" rel=\"noopener\">compatibility notes<\/a> before starting.<\/p>\n<p>Installing Mono on a modern Linux system is just a matter of typing a few commands and waiting for a few packages to download. On Debian, running the following command will give you the runtime, development toolchain, an embedded ASP.NET-compatible web server, and an IDE with a few useful plugins. This will get you started, although for a more permanent replacement for <abbr title=\"Internet Information Services\">IIS<\/abbr>, you will want to look into <a title=\"mod_mono for Apache\" href=\"http:\/\/www.mono-project.com\/docs\/web\/mod_mono\/\" target=\"_blank\" rel=\"noopener\">mod_mono<\/a> for the popular <a title=\"Apache HTTP server\" href=\"http:\/\/httpd.apache.org\/\" target=\"_blank\" rel=\"noopener\"> Apache HTTP server<\/a>.<\/p>\n<p><code>sudo aptitude install mono-devel mono-xsp4 monodevelop monodevelop-nunit monodevelop-versioncontrol nuget<\/code><\/p>\n<p>On my machine it installed Mono version 3.2.8. The <a title=\"Download mono\" href=\"http:\/\/www.mono-project.com\/download\/\" target=\"_blank\" rel=\"noopener\">latest release<\/a> at the time of writing is 3.12.0. Meh, close enough. Although if you want the latest and greatest, convenient <a title=\"Donload Mono for Linux\" href=\"http:\/\/www.mono-project.com\/download\/#download-lin\" target=\"_blank\" rel=\"noopener\">packages are available<\/a>.<\/p>\n<h2>The development environment<\/h2>\n<p>Now that we are setup and good to go, we needed something to tinker with. I decided to dive into Triforks source code repository and fetch the first .NET project that crossed my mind. It can be opened directly inside <a title=\"MonoDevelop IDE for C#\" href=\"http:\/\/www.monodevelop.com\/\" target=\"_blank\" rel=\"noopener\">MonoDevelop<\/a>, which is the official IDE for the Mono project, and supports&nbsp;C#, F#, Visual Basic .NET, C\/C++, and Vala. It can natively open <abbr title=\"VisualStudio solution\">SLN<\/abbr> and <abbr title=\"C# project\">CSProj<\/abbr> files.<\/p>\n<p>A small complaint I have is that MonoDevelop tends to reformat and rearrange the project files. Not a big deal, but it does make it harder to compare the files with the originals.<\/p>\n<p>When opening a new project, MonoDevelop will attempt to download the required assemblies using the <a title=\"NuGet package manager\" href=\"https:\/\/www.nuget.org\/\" target=\"_blank\" rel=\"noopener\">NuGet<\/a> package manager. It may complain about an invalid certificate, because none are trusted in Mono by default. Certificates can be imported by running the following command:<\/p>\n<p><code>mozroots --sync --import<\/code><\/p>\n<p>After that it worked as expected for the most part. Although it did fail to download some of the packages because for some reason it could not resolve some transitive dependencies. If that happens, you will want run it manually. Telling it to download the transitive dependency explicitly with a specific version number did the trick:<\/p>\n<p><code>nuget install jQuery -Version 2.1.3<\/code><\/p>\n<p>And after a few hours your workspace may look something like this.<\/p>\n<figure id=\"attachment_13511\" aria-describedby=\"caption-attachment-13511\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-13511 size-medium\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png\" alt=\"Mysterious .NET project running\" width=\"300\" height=\"228\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-1024x780.png 1024w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-768x585.png 768w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg.png 1308w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-13511\" class=\"wp-caption-text\">A .NET project running inside MonoDevelop<\/figcaption><\/figure>\n<h2>Building and running the project<\/h2>\n<p>Now that the assemblies are in place, clicking on <em>Build<\/em>, <em>Build All<\/em> in MonoDevelop yields the first interesting error:<\/p>\n<p><q>The type or namespace name `AccountManagement&#8217; does not exist in the namespace `System.DirectoryServices&#8217;. Are you missing an assembly reference?<\/q><\/p>\n<p>Am I? No, it does not seem to be implemented in Mono. This is an example of Windows-specific functionality, and it would need to be rewritten. A quick look at the project code reveals that it is used for managing user groups. In my case this was not a crucial functionality, so I was able to replace the code with a simple mock.<\/p>\n<p>Identifying such platform-specific functionality and listing possible solutions is a good starting point in considering if moving to another platform is at all worthwhile. The exact amount of work may vary greatly depending on alternatives available, how tightly it is integrated into the project, etc.<\/p>\n<p>Luckily that was the only build error, and I could attempt to run the project. But before doing that, an essential difference in how Windows and Linux systems handle file systems has to be considered. If the software was developed on Windows, it is very likely to use Windows paths such as <q>C:\\Directory\\File.txt<\/q> as opposed to what is expected on Linux such as <q>\/directory\/file.txt<\/q>. This and case-sensitivity is the most common source of headache. Mono does have a work-around, which can be enabled by setting the environment variable <a title=\"IOMap\" href=\"http:\/\/www.mono-project.com\/docs\/advanced\/iomap\/\" target=\"_blank\" rel=\"noopener\">MONO_IOMAP<\/a> like this:<\/p>\n<p><code>MONO_IOMAP=all mono myapp.exe<\/code><\/p>\n<p>Although first make sure that it is really needed, because such magic solutions may cause problems as much as solve them, and you may end up with a confusing error message. Fixing the core of the problem inside the source code is often the more reliable and permanent solution. Do not rely on absolute paths, but rather use paths relative to where your application is deployed, whenever possible.<\/p>\n<figure id=\"attachment_13506\" aria-describedby=\"caption-attachment-13506\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/dir-not-found.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-13506 size-medium\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/dir-not-found-300x292.png\" alt=\"MONO_IOMAP causing directory to not be found\" width=\"300\" height=\"292\"><\/a><figcaption id=\"caption-attachment-13506\" class=\"wp-caption-text\">Directory not found exception<\/figcaption><\/figure>\n<p>Other useful parameters are <a title=\"Mono log level\" href=\"http:\/\/www.mono-project.com\/docs\/advanced\/runtime\/logging-runtime-events\/#trace-levels\" target=\"_blank\" rel=\"noopener\">MONO_LOG_LEVEL=debug<\/a> and <a title=\"Mono trace filters\" href=\"http:\/\/www.mono-project.com\/docs\/advanced\/runtime\/logging-runtime-events\/#trace-filters\" target=\"_blank\" rel=\"noopener\">MONO_LOG_MASK=asm<\/a>, which will make Mono output detailed information about assemblies being loaded. It will come in handy when there is something wrong with the project dependencies. In my case it was a .NET 4.0 project trying to load a&nbsp;library built for .NET 4.5.<\/p>\n<p>These can also be set up from within MonoDevelop inside <em>Project Options<\/em>.<\/p>\n<figure id=\"attachment_13502\" aria-describedby=\"caption-attachment-13502\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/project-options.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-13502 size-medium\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/project-options-300x258.png\" alt=\"MonoDevelop Project Option\" width=\"300\" height=\"258\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/02\/project-options-300x258.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/02\/project-options.png 652w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-13502\" class=\"wp-caption-text\">Project Options in MonoDevelop<\/figcaption><\/figure>\n<p>One more important thing I will only mention briefly is a database (or data storage in general). If your project uses Microsoft SQL Server, get ready to get your hands dirty migrating your data elsewhere. Case-sensitivity will probably be your enemy number one once again. In addition to SQL statements, watch out for C# code like <code>something.ToUpper().Equals(somethingElse)<\/code>, which may potentially be a problem if <code>somethingElse<\/code> is read from a database. You may want to do something like <code>something.ToUpper().Equals(somethingElse.ToUpper())<\/code> to make it consistent.<\/p>\n<h2>Conclusions<\/h2>\n<p>So is it realistic to deploy your .NET applications on Linux? I would say yes. Even though you have to be aware of the platform you are targeting, and some compatibility problems are to be expected. But with Microsoft backing Mono, it will only become easier and more reliable to run .NET software on alternative platforms. When the platform is no longer dictated by the implementation technology, it becomes a question of what serves the interest of the involved parties best? It becomes a motivated choice.<\/p>\n<p>&nbsp;<\/p>\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/bit.ly\/3BAo305\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"256\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png\" alt=\"\" class=\"wp-image-20303\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1024x256.png 1024w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-300x75.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-768x192.png 768w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1536x384.png 1536w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-2048x512.png 2048w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2022\/02\/Blog-Banner-1-1920x480.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>The motivation The obvious question here is why would you want to develop .NET software on Linux or for Linux? At the risk of sounding like throwing buzzwords around, I will say it is because Linux dominates the cloud completely. Many cloud-related technologies such as Docker, Mesos, and others build on Linux as a base. [&hellip;]<\/p>\n","protected":false},"author":118,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[346,337,10],"tags":[402,344,48,403],"class_list":["post-13475","post","type-post","status-publish","format-standard","hentry","category-c","category-from-the-trenches","category-development","tag-net","tag-c","tag-linux","tag-mono"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Developing .NET software on Linux with Mono - Trifork Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Developing .NET software on Linux with Mono - Trifork Blog\" \/>\n<meta property=\"og:description\" content=\"The motivation The obvious question here is why would you want to develop .NET software on Linux or for Linux? At the risk of sounding like throwing buzzwords around, I will say it is because Linux dominates the cloud completely. Many cloud-related technologies such as Docker, Mesos, and others build on Linux as a base. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/\" \/>\n<meta property=\"og:site_name\" content=\"Trifork Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-02-19T13:33:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png\" \/>\n<meta name=\"author\" content=\"Linas Zvirblis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Linas Zvirblis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/\",\"url\":\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/\",\"name\":\"Developing .NET software on Linux with Mono - Trifork Blog\",\"isPartOf\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png\",\"datePublished\":\"2015-02-19T13:33:34+00:00\",\"author\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a6f741bf8b95de88b6e33446191579d4\"},\"breadcrumb\":{\"@id\":\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#primaryimage\",\"url\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png\",\"contentUrl\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/trifork.nl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developing .NET software on Linux with Mono\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/trifork.nl\/blog\/#website\",\"url\":\"https:\/\/trifork.nl\/blog\/\",\"name\":\"Trifork Blog\",\"description\":\"Keep updated on the technical solutions Trifork is working on!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/trifork.nl\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a6f741bf8b95de88b6e33446191579d4\",\"name\":\"Linas Zvirblis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6f4e65d290c60b97a59946e948996b74?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6f4e65d290c60b97a59946e948996b74?s=96&d=mm&r=g\",\"caption\":\"Linas Zvirblis\"},\"url\":\"https:\/\/trifork.nl\/blog\/author\/trifork-copenhagen\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Developing .NET software on Linux with Mono - Trifork Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/","og_locale":"en_US","og_type":"article","og_title":"Developing .NET software on Linux with Mono - Trifork Blog","og_description":"The motivation The obvious question here is why would you want to develop .NET software on Linux or for Linux? At the risk of sounding like throwing buzzwords around, I will say it is because Linux dominates the cloud completely. Many cloud-related technologies such as Docker, Mesos, and others build on Linux as a base. [&hellip;]","og_url":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/","og_site_name":"Trifork Blog","article_published_time":"2015-02-19T13:33:34+00:00","og_image":[{"url":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png","type":"","width":"","height":""}],"author":"Linas Zvirblis","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Linas Zvirblis","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/","url":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/","name":"Developing .NET software on Linux with Mono - Trifork Blog","isPartOf":{"@id":"https:\/\/trifork.nl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#primaryimage"},"image":{"@id":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#primaryimage"},"thumbnailUrl":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png","datePublished":"2015-02-19T13:33:34+00:00","author":{"@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a6f741bf8b95de88b6e33446191579d4"},"breadcrumb":{"@id":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#primaryimage","url":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png","contentUrl":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/02\/monodevelop-tidsreg-300x228.png"},{"@type":"BreadcrumbList","@id":"https:\/\/trifork.nl\/blog\/developing-dotnet-software-on-linux-with-mono\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/trifork.nl\/blog\/"},{"@type":"ListItem","position":2,"name":"Developing .NET software on Linux with Mono"}]},{"@type":"WebSite","@id":"https:\/\/trifork.nl\/blog\/#website","url":"https:\/\/trifork.nl\/blog\/","name":"Trifork Blog","description":"Keep updated on the technical solutions Trifork is working on!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trifork.nl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/a6f741bf8b95de88b6e33446191579d4","name":"Linas Zvirblis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6f4e65d290c60b97a59946e948996b74?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6f4e65d290c60b97a59946e948996b74?s=96&d=mm&r=g","caption":"Linas Zvirblis"},"url":"https:\/\/trifork.nl\/blog\/author\/trifork-copenhagen\/"}]}},"_links":{"self":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/13475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/users\/118"}],"replies":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/comments?post=13475"}],"version-history":[{"count":0,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/13475\/revisions"}],"wp:attachment":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media?parent=13475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/categories?post=13475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/tags?post=13475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}