[ 
https://issues.apache.org/jira/browse/LUCENENET-602?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16513268#comment-16513268
 ] 

Shad Storhaug commented on LUCENENET-602:
-----------------------------------------

Thanks for the report.

I took a look and it really isn't very clear what the future holds for this 
problem. According to 
[Microsoft|https://docs.microsoft.com/en-us/xamarin/ios/internals/limitations#value-types-as-dictionary-keys]
 this is a current issue and it isn't clear whether they intend to address it. 
However, according to [this 
page|http://www.mono-project.com/docs/advanced/aot/#generic-valuetype-sharing] 
it sounds like this should be currently supported. Microsoft's documentation 
was apparently copied from [this 
page|http://www.mono-project.com/archived/monotouchlimitations/], which was 
last updated in 2009. Then again, according to [this 
comment|http://www.mono-project.com/docs/advanced/aot/#limitations]:
{quote}As of Mono 2.0, AOT compilation is only supported for non-generic 
methods. support for generics is currently under development.
{quote}
Since I can't seem to find a way to detect whether the AOT compilation is 
enabled and there are clear advantages (optimizations) for calling 
{{System.Collections.Generic.EqualityComparer<T>.Default}} on other platforms, 
I ended up wrapping it in a new comparer 
{{Lucene.Net.Support.EqualityComparer<T>.Default}}, which attempts to call 
{{System.Collections.Generic.EqualityComparer<T>.Default}} the first time and 
if there is an exception it will store a nullable boolean in a static field to 
indicate whether value types are supported, or null to indicate the check 
hasn't yet been done. After the initial attempt, it will simply call the 
correct comparer depending on the state of the boolean. That should fix the 
issue and also cover the case where it is eventually patched.

This could be improved if there were a specific exception to catch (you didn't 
include it in the stack trace) to narrow down the field - right now it catches 
when any exception is thrown and the type is a value type, but allows all other 
exceptions to be thrown.

Version [4.8.0-ci0000001189 on the CI 
Feed|https://www.myget.org/gallery/lucene-net-ci] has the update - let us know 
if that fixes the problem.
----
We'd appreciate a pull request to update the [Powershell build 
script|https://github.com/apache/lucenenet/blob/master/build/build.ps1] so it 
works on Xamarin.iOS, Xamarin.Android, and UWP, and then we can set it up in 
TeamCity to continually test these platforms and help us track down issues (if 
you have the time, we should also do Mono and Xamarin.Mac). Unfortunately, I 
don't currently have access to all of these platforms nor the space that would 
be required to virtualize/emulate them in order to ensure the script works, and 
doing it all on the TeamCity server would be slow going.

The test task begins 
[here|https://github.com/apache/lucenenet/blob/master/build/build.ps1#L248] - 
we would need an update to that and might need to update the tasks to install 
platforms, if required (we had to do that for dotnet core because the TeamCity 
servers don't necessarily have the version we need installed and end users 
might not, as well).

To test, the {{build/build.ps1}} script is run with the following command from 
TeamCity:
{code}
Import-Module .\build\psake.psm1; Invoke-Psake .\build\build.ps1 -Task Test 
-properties 
@{frameworks_to_test='netcoreapp2.0';backup_files='false';prepareForBuild='false'}
{code}
To build, pack and then test (which we use from the command line), the command 
looks like:
{code}
Import-Module .\build\psake.psm1; Invoke-Psake .\build\build.ps1 Default,Test 
-properties @{configuration='Release'} -parameters @{ 
packageVersion='4.8.0-beta00006';version='0.0.0' }
{code}
We are using PSake as a task manager, and the documentation for it is 
[here|http://psake.readthedocs.io/en/latest/].

Also, we currently only have a {{build.bat}} file to launch the command 
manually, which needs to be translated into a {{build.sh}} to run 
cross-platform. Note that TeamCity does not use this file, it is only for end 
users who want to build/test. Also note this file is [automatically 
re-generated during a 
release|https://github.com/apache/lucenenet/blob/master/build/build.ps1#L423] 
by the PSake script so the user only needs to type "build" on the command line 
and the version of the current release will be baked in - we would want to do 
that for a {{build.sh}} file, too.

> Error using Lucene.Net.Facet 4.8.0-beta00005  with Xamarin.iOS
> --------------------------------------------------------------
>
>                 Key: LUCENENET-602
>                 URL: https://issues.apache.org/jira/browse/LUCENENET-602
>             Project: Lucene.Net
>          Issue Type: Bug
>          Components: Lucene.Net.Facet
>    Affects Versions: Lucene.Net 4.8.0
>         Environment: Xamarin Forms 3.0.0.561731
> Ios 10.3.3 and Higher
> Lucene.Net.Facet 4.8.0-beta00005
>            Reporter: Enrico Caltran
>            Priority: Blocker
>              Labels: AOT, Xamarin.iOS, lucene.net.facet
>             Fix For: Lucene.Net 4.8.0
>
>   Original Estimate: 120h
>  Remaining Estimate: 120h
>
> I'm using Lucene.Net.Facet 4.8.0-beta00005 in a big Xamarin project.
> +With Xamarin.Android and Xamarin.UWP it's all right.+
> *+But With Xamarin.iOS on device (Ipad)+*, i'm receiving this error:
>  _Attempting to JIT compile method 
> 'Lucene.Net.Support.LurchTable2&lt;Lucene.Net.Facet.Taxonomy.FacetLabel, 
> Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader/Int32Class&gt;:InternalInsert&lt;Lucene.Net.Support.LurchTable2/Add2Info<Lucene.Net.Facet.Taxonomy.FacetLabel,
>  Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader/Int32Class>> 
> (int,Lucene.Net.Facet.Taxonomy.FacetLabel,int&,Lucene.Net.Support.LurchTable`2/Add2Info<Lucene.Net.Facet.Taxonomy.FacetLabel,
>  Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader/Int32Class>&)' 
> while running in aot-only mode. See 
> [https://developer.xamarin.com/guides/ios/advanced_topics/limitations/] for 
> more information._
> _{color:#d04437}at Lucene.Net.Support.LurchTable2[TKey,TValue].Insert[T] 
> (TKey key, T&amp; value) &lt;0x2570f48 + 0x000e0&gt; in 
> &lt;063e095c95d945a4ace32ab83d1227eb#2ae0fea9ea4eacaef83bf2e9713bb8ea&gt;:0 
> at (wrapper unknown) System.Object.gsharedvt_in() at 
> Lucene.Net.Support.LurchTable2[TKey,TValue].AddOrUpdate (TKey key, TValue 
> addValue, Lucene.Net.Support.KeyValueUpdate2[TKey,TValue] fnUpdate) 
> &lt;0x232824c + 0x0013b&gt; in 
> &lt;063e095c95d945a4ace32ab83d1227eb#2ae0fea9ea4eacaef83bf2e9713bb8ea&gt;:0 
> at Lucene.Net.Facet.Taxonomy.LRUHashMap2[TKey,TValue].Put (TKey key, TValue 
> value) <0x2c487f8 + 0x0015b> in 
> <79d3a7b905954d0993025c09c5d087ce#2ae0fea9ea4eacaef83bf2e9713bb8ea>:0 at 
> Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader.GetOrdinal 
> (Lucene.Net.Facet.Taxonomy.FacetLabel cp) <0x2c51970 + 0x0019b> in 
> <79d3a7b905954d0993025c09c5d087ce#2ae0fea9ea4eacaef83bf2e9713bb8ea>:0 at 
> Lucene.Net.Facet.Taxonomy.Int32TaxonomyFacets.GetTopChildren{color} 
> (System.Int32 topN, System.String dim, System.String[] path) <0x2c481dc + 
> 0x0008f> in 
> <79d3a7b905954d0993025c09c5d087ce#2ae0fea9ea4eacaef83bf2e9713bb8ea>:0 at 
> Login.MyMB.Lucene.Client.LuceneArticoliSearcher.GetListaArticoloXRicercaAvanzataConRicercaSemplice
>  (System.Collections.Generic.List1[T] listParametri) &lt;0x224add0 + 
> 0x001bb&gt; in 
> &lt;8f49891e0f0546e185aba7424d294ef7#2ae0fea9ea4eacaef83bf2e9713bb8ea&gt;:0 
> at 
> Login.MyMB.Lucene.Client.LuceneArticoliSearcher.GetListaArticoloConRicercaSemplice
>  (System.Collections.Generic.List1[T] listParametri) <0x224afbc + 0x0009f> in 
> <8f49891e0f0546e185aba7424d294ef7#2ae0fea9ea4eacaef83bf2e9713bb8ea>:0 at 
> MyMB.Forms.RicercaLucene.RicercaArticoloLucene.GetListaArticoliXRicercaSemplice
>  (Login.MyMB.Interface.IAmbiente ambiente, 
> Login.MyMB.Lucene.Client.LuceneArticoliSearcher las, 
> System.Collections.Generic.List`1[T] ListParametri, System.Boolean 
> isAbilitataRicercaBarcode) <0xe47fc0 + 0x000e7> in 
> <f1bb3149abe145459612794f1a096634#2ae0fea9ea4eacaef83bf2e9713bb8ea>:0 
> ..............................._
> At the link 
> [https://docs.microsoft.com/it-it/xamarin/ios/internals/limitations] , I 
> found the problem cause (I suppose...):
> _Value types as Dictionary Keys Using a value type as a Dictionary<TKey, 
> TValue> key is problematic, as the default Dictionary constructor attempts to 
> use EqualityComparer<TKey>.Default. EqualityComparer<TKey>.Default, in turn, 
> attempts to use Reflection to instantiate a new type which implements the 
> IEqualityComparer<TKey> interface. This works for reference types (as the 
> reflection+create a new type step is skipped), but for value types it crashes 
> and burns rather quickly once you attempt to use it on the device. 
> Workaround: Manually implement the IEqualityComparer<TKey> interface in a new 
> type and provide an instance of that type to the Dictionary<TKey, TValue> 
> (IEqualityComparer<TKey>) constructor._
> So, what can I do? Thank you in advance, Enrico Caltran +393357485560 
> [enrico.calt...@timegroup.it|mailto:enrico.calt...@timegroup.it]



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to