[
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<Lucene.Net.Facet.Taxonomy.FacetLabel,
> Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader/Int32Class>:InternalInsert<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& value) <0x2570f48 + 0x000e0> in
> <063e095c95d945a4ace32ab83d1227eb#2ae0fea9ea4eacaef83bf2e9713bb8ea>: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)
> <0x232824c + 0x0013b> in
> <063e095c95d945a4ace32ab83d1227eb#2ae0fea9ea4eacaef83bf2e9713bb8ea>: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) <0x224add0 +
> 0x001bb> in
> <8f49891e0f0546e185aba7424d294ef7#2ae0fea9ea4eacaef83bf2e9713bb8ea>: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
> [[email protected]|mailto:[email protected]]
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)