// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
= Cross-Platform Support

== Overview

Starting with version 2.4, Ignite.NET supports .NET Core. It is possible to run .NET nodes and develop Ignite.NET
applications for Linux and macOS, as well as Windows.

== .NET Core

*Requirements:*

* https://www.microsoft.com/net/download/[.NET Core SDK 2.0+, window=_blank]
* http://www.oracle.com/technetwork/java/javase/downloads/index.html[Java 8+, window=_blank] (macOS requires JDK, otherwise JRE works)

*Running Examples*
https://ignite.apache.org/download.cgi#binaries[Binary distribution, window=_blank] includes .NET Core examples:

* Download https://ignite.apache.org/download.cgi#binaries[binary distribution, window=_blank] from the Ignite website and extract into any directory.
* `cd platforms/dotnet/examples/dotnetcore`
* `dotnet run`

== Java Detection

Ignite.NET looks for a Java installation directory in the following places:

* `HKLM\Software\JavaSoft\Java Runtime Environment` (Windows)
* `/usr/bin/java` (Linux)
* `/Library/Java/JavaVirtualMachines` (macOS)

If you changed the default location of Java, then specify the actual path using one of the methods below:

* Set the `IgniteConfiguration.JvmDllPath` property
* or set the `JAVA_HOME` environment variable

== Known Issues

*No Java runtime present, requesting install*

Java `8u151` has a known bug on macOS: https://bugs.openjdk.java.net/browse/JDK-7131356[JDK-7131356, window=_blank]. Make sure to install `8u152` or later.

*Serializing delegates is not supported on this platform*

.NET Core does not support delegate serialization, `System.MulticastDelegate.GetObjectData`
just https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/MulticastDelegate.cs#L52[throws an exception, window=_blank],
so Ignite.NET can not serialize delegates or objects containing them.

*Could not load file or assembly 'System.Configuration.ConfigurationManager'*

Known https://github.com/dotnet/standard/issues/506[.NET issue (506), window=_blank], in some cases additional package reference is required:

* `dotnet add package System.Configuration.ConfigurationManager`
