akkadotnet / akka.net

Canonical actor model implementation for .NET with local + distributed actors in C# and F#.
http://getakka.net
Other
4.7k stars 1.04k forks source link

Akka.Configuration.ConfigurationException in Xamarin.iOS #3340

Closed OpenBoxLab closed 6 years ago

OpenBoxLab commented 6 years ago

When Akka(1.3.5) configuration has a remote provider, ActorSystem.Create() has thrown ConfigurationException in Xamarin.iOS (11.6.1.4).

'akka.actor.provider; is not a valid type name: 'Akka.Remote.RemoteActorRefProvider, Akka.Remote'

Reason: providerType is null. https://github.com/akkadotnet/akka.net/blob/dev/src/core/Akka/Actor/Settings.cs#L68

Here is a test code and packages.conf.

var config = ConfigurationFactory.ParseString(@"
akka {
    actor {
        provider = remote
    }
    remote {
         dot-netty.tcp {
            port = 0 #bound to a specific port
        }
    }
}");
ActorSystem system = ActorSystem.Create("mySystem", config);
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Akka" version="1.3.5" targetFramework="xamarinios10" />
  <package id="Akka.Remote" version="1.3.5" targetFramework="xamarinios10" />
  <package id="DotNetty.Buffers" version="0.4.7" targetFramework="xamarinios10" />
  <package id="DotNetty.Codecs" version="0.4.7" targetFramework="xamarinios10" />
  <package id="DotNetty.Common" version="0.4.7" targetFramework="xamarinios10" />
  <package id="DotNetty.Handlers" version="0.4.7" targetFramework="xamarinios10" />
  <package id="DotNetty.Transport" version="0.4.7" targetFramework="xamarinios10" />
  <package id="Google.Protobuf" version="3.5.1" targetFramework="xamarinios10" />
  <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="2.0.0" targetFramework="xamarinios10" />
  <package id="Microsoft.Extensions.Logging" version="2.0.0" targetFramework="xamarinios10" />
  <package id="Microsoft.Extensions.Logging.Abstractions" version="2.0.0" targetFramework="xamarinios10" />
  <package id="Microsoft.Extensions.Options" version="2.0.0" targetFramework="xamarinios10" />
  <package id="Microsoft.Extensions.Primitives" version="2.0.0" targetFramework="xamarinios10" />
  <package id="Microsoft.NETCore.Platforms" version="2.0.1" targetFramework="xamarinios10" />
  <package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="NETStandard.Library" version="2.0.1" targetFramework="xamarinios10" />
  <package id="Newtonsoft.Json" version="11.0.1" targetFramework="xamarinios10" />
  <package id="System.AppContext" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Collections" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Collections.Concurrent" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Collections.Immutable" version="1.4.0" targetFramework="xamarinios10" />
  <package id="System.ComponentModel" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Console" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.Contracts" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.TraceSource" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Globalization" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Globalization.Calendars" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Globalization.Extensions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.Compression" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.FileSystem" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Linq" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Linq.Expressions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Net.Http" version="4.3.3" targetFramework="xamarinios10" />
  <package id="System.Net.NameResolution" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Net.NetworkInformation" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Net.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Net.Security" version="4.3.2" targetFramework="xamarinios10" />
  <package id="System.Net.Sockets" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.ObjectModel" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection.Emit" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Reflection.TypeExtensions" version="4.4.0" targetFramework="xamarinios10" />
  <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.CompilerServices.Unsafe" version="4.4.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Extensions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Handles" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Runtime.Numerics" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="xamarinios10" />
  <package id="System.Text.Encoding" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading.Tasks" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading.Thread" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading.ThreadPool" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Threading.Timer" version="4.3.0" targetFramework="xamarinios10" />
  <package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="xamarinios10" />
  <package id="System.Xml.XDocument" version="4.3.0" targetFramework="xamarinios10" />
</packages>

I was wondering if this is a bug or package dependency trouble.

OpenBoxLab commented 6 years ago

It seems to be a limitation of Xamarin.iOS(AOT) - DISABLED JIT engine.

This is not a problem for regular .NET or Mono runtimes as the code is always compiled at runtime using the Just in Time compiler. But this poses a challenge for a static compiler like Xamarin.iOS.

I was able to avoid this limitation by adding a definition from Akka.Remote before calling ActorSystem.Create(...).

RemoteActorRef remoteActor; // just only for loading "Akka.Remote" ActorSystem system = ActorSystem.Create("mySystem", config);

For "akka.actor.provider" (remote/cluster), iOS limitation should be handled as suggested in #1300.