Monodroid łączący zespoły Sdk powodujące SIGSEGV w bibliotece Mono

Mam kod C# na Androida, który działa dobrze podczas korzystania ze wspólnego środowiska wykonawczego (Mono) lub łączenia zestawów Sdk, ale gdy oba są obecne, przestaje działać. Mogę budować bez łączenia, bez korzystania ze współdzielonego środowiska wykonawczego i działa to bezbłędnie, ale kiedy próbuję spakować do wdrożenia (łączenie Sdk i brak współdzielonego środowiska wykonawczego), otrzymuję SIGSEGV:

03-22 08:23:56.486 E/mono-rt ( 2526): Stacktrace:
03-22 08:23:56.486 E/mono-rt ( 2526): 
03-22 08:23:56.496 E/mono-rt ( 2526):   at <unknown> <0xffffffff>
03-22 08:23:56.496 E/mono-rt ( 2526):   at (wrapper managed-to-native) System.Net.Sockets.Socket.SetSocketOption_internal (intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object,byte[],int,int&) <IL 0x0002a, 0xffffffff>
03-22 08:23:56.496 E/mono-rt ( 2526):   at System.Net.Sockets.Socket.SetSocketOption (System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object) <IL 0x000c2, 0x004cf>
03-22 08:23:56.496 E/mono-rt ( 2526):   at Keiser.Plugin.Socket.NetSocket.CreateListeningSocket () [0x00041] in d:\Development\Keiser.MPM.Screen\Keiser.Plugin.Socket.Droid\NetSocket.cs:73
03-22 08:23:56.496 E/mono-rt ( 2526):   at Keiser.Plugin.Socket.NetSocket.StartListener (System.AsyncCallback) [0x00012] in d:\Development\Keiser.MPM.Screen\Keiser.Plugin.Socket.Droid\NetSocket.cs:92
The program 'Mono' has exited with code 0 (0x0).

Ostatnia metoda w moim kodzie jest następująca:

    protected virtual void CreateListeningSocket()
    {
        lock (Locker)
        {
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, _port);
            _socket.Bind(ipEndPoint);
            _socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse(_ipAddress)));
            _endPointSender = new IPEndPoint(IPAddress.Any, 0);
        }
    }

Czy jest jakiś sposób na rozwiązanie tego problemu? Próbowałem refaktoryzacji przy użyciu UDPClient, ale daje ten sam błąd w wierszu, w którym wywołuję JoinMulticastGroup w obiekcie UDPClient. Czy jest to błąd wewnątrz zespołu monodroidu?

** Uwaga: ten kod znajduje się we wtyczce MvvmCross, do której odwołuje się Core PCL dla projektu, który sam w sobie jest odniesieniem dla projektu Androida.


person BayssMekanique    schedule 22.03.2014    source źródło


Odpowiedzi (2)


Teraz wiem, jak go odtworzyć, wysłałem go do Xamarin. Dzieje się tak podczas wywoływania JoinMulticastGroup, a także uruchamiania innej operacji na gnieździe w tle. https://bugzilla.xamarin.com/show_bug.cgi?id=22183 Powtarzalne w Mono 5.4. Rozwiązaniem jest JoinMulticastGroup przed wykonaniem jakichkolwiek innych operacji na gniazdach.

person Michal Dobrodenka    schedule 14.11.2017

Nadal nie wiem DLACZEGO tak się dzieje, ale znalazłem rozwiązanie.

We właściwościach rozwiązania Android, na karcie Opcje systemu Android, z wybraną konfiguracją wydania, użyłem łączenia tylko zespołów SDK, dodałem System do opcji Pomiń łączenie zespołów i wyłączyłem opcję „Użyj współdzielonego środowiska wykonawczego”.

To sprawia, że ​​plik APK jest nieco większy, ale niewiele (w moim przypadku 10,1 Mb w porównaniu z 9,8 Mb).

person BayssMekanique    schedule 24.03.2014
comment
Jeśli wiesz dokładnie, które funkcje zostały usunięte przez linker, możesz także dodać plik skryptu linkera dla tych konkretnych funkcji. Np. zobacz: forums.xamarin.com/discussion/comment/5804/#Comment_5804 - person Sven-Michael Stübe; 24.03.2014
comment
To jest trudne. Mam te same funkcje w innych częściach, które działały dobrze, więc problem leży gdzieś głębiej niż funkcja SetSocketOption_internal. Próbowałem wykluczyć System.Net z łączenia, ale to nie rozwiązało problemu, zadziałało dopiero po wykluczeniu System.dll. - person BayssMekanique; 25.03.2014