-
Notifications
You must be signed in to change notification settings - Fork 536
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Starting in Xamarin.Android 10.3, "System.MemberAccessException: Cannot create an instance of ... `1[T]" in Debug configuration when using certain APIs that have both generic and non-generic versions #4809
Comments
I have only been able to reproduce this in the Debug configuration (with the debug libmonodroid.so), so it seems the fixes for Release configuration builds (with the release libmonodroid.so) are still verified. |
log-new-fastdev.txt I can't reproduce the issue with |
Ah, yep. I can't reproduce either using a locally built Steps I followed:
|
@brendanzagaeski It appears you don't need to get |
Fixes: dotnet#4809 Context: 7117414 Context: a017561 Part of the a017561 commit dealt with mappings from certain Java types which point to the same Managed type by making sure that they all refer to the same type definition and managed type name. However, in doing so it failed to synchronize the property which indicates that we are dealing with an interface or generic type, in which case such a type should be ignored by the type mapping code in the runtime. In this particular case, the issue was with the `ArrayAdapter` type which has both a generic and non-generic definitions and it so happens that the *first* type in `Mono.Android` assembly is the generic one, thus it, and its duplicate, should be ignored but due to the failure to synchronize the `SkipInJavaToManaged` property, the second instance of the type was not skipped on the runtime, resulting in the following exception: System.MemberAccessException: Cannot create an instance of Android.Widget.ArrayAdapter`1[T] because Type.ContainsGenericParameters is true. at System.Reflection.RuntimeConstructorInfo.DoInvoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00054] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at System.Reflection.RuntimeConstructorInfo.Invoke (System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at System.Reflection.ConstructorInfo.Invoke (System.Object[] parameters) [0x00000] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at Java.Interop.TypeManager.CreateProxy (System.Type type, System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x0001b] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Interop.TypeManager.CreateInstance (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type targetType) [0x00111] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object.GetObject (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type type) [0x00023] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object._GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00017] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object.GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00000] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Android.Widget.ArrayAdapter.CreateFromResource (Android.Content.Context context, System.Int32 textArrayResId, System.Int32 textViewResId) [0x0006d] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at AndroidApp1.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x00031] in <51ce4ed05744482eb8a8079a399a17d2>:0 at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.3(intptr,intptr,intptr) This commit adds synchronization of the `SkipInJavaToManaged` property which results in the sample attached to the GitHub issue to work properly. Note: for some weird reason the error occurred *only* with the *Release* build of `Mono.Android.dll` and *only* in the framework v9.0 (that is API28) - if the app targetted any other API it would not fail. I can't see why this would be so since the relevant code was very similar between v9.0 and other frameworks and it was *identical* in case of the *Debug* build of the v9.0 framework.
Fixes: #4809 Context: 7117414 Context: a017561 Part of commit a017561 dealt with mappings from certain Java types which point to the same Managed type by making sure that they all refer to the same type definition and managed type name. However, in doing so it failed to synchronize the property which indicates that we are dealing with an interface or generic type, in which case such a type should be ignored by the type mapping code in the runtime. In this particular case, the issue was with the `ArrayAdapter` type, which has both generic and non-generic definitions, and it so happens that the *first* type in `Mono.Android` assembly is the generic one, thus it, and its duplicate, should be ignored but due to the failure to synchronize the `SkipInJavaToManaged` property, the second instance of the type was not skipped on the runtime, resulting in the following exception: System.MemberAccessException: Cannot create an instance of Android.Widget.ArrayAdapter`1[T] because Type.ContainsGenericParameters is true. at System.Reflection.RuntimeConstructorInfo.DoInvoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00054] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at System.Reflection.RuntimeConstructorInfo.Invoke (System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at System.Reflection.ConstructorInfo.Invoke (System.Object[] parameters) [0x00000] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at Java.Interop.TypeManager.CreateProxy (System.Type type, System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x0001b] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Interop.TypeManager.CreateInstance (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type targetType) [0x00111] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object.GetObject (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type type) [0x00023] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object._GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00017] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object.GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00000] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Android.Widget.ArrayAdapter.CreateFromResource (Android.Content.Context context, System.Int32 textArrayResId, System.Int32 textViewResId) [0x0006d] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at AndroidApp1.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x00031] in <51ce4ed05744482eb8a8079a399a17d2>:0 at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.3(intptr,intptr,intptr) This commit adds synchronization of the `SkipInJavaToManaged` property which results in the sample attached to the GitHub issue to work properly. Note: for some weird reason the error occurred *only* with the *Release* build of `Mono.Android.dll` and *only* with `$(TargetFrameworkVersion)`=v9.0 (API-28); if the app used any other framework version it would not fail. I can't see why this would be so since the relevant code was very similar between v9.0 and other frameworks and it was *identical* in case of the *Debug* build of the v9.0 framework.
Fixes: #4809 Context: 7117414 Context: a017561 Part of commit a017561 dealt with mappings from certain Java types which point to the same Managed type by making sure that they all refer to the same type definition and managed type name. However, in doing so it failed to synchronize the property which indicates that we are dealing with an interface or generic type, in which case such a type should be ignored by the type mapping code in the runtime. In this particular case, the issue was with the `ArrayAdapter` type, which has both generic and non-generic definitions, and it so happens that the *first* type in `Mono.Android` assembly is the generic one, thus it, and its duplicate, should be ignored but due to the failure to synchronize the `SkipInJavaToManaged` property, the second instance of the type was not skipped on the runtime, resulting in the following exception: System.MemberAccessException: Cannot create an instance of Android.Widget.ArrayAdapter`1[T] because Type.ContainsGenericParameters is true. at System.Reflection.RuntimeConstructorInfo.DoInvoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00054] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at System.Reflection.RuntimeConstructorInfo.Invoke (System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at System.Reflection.ConstructorInfo.Invoke (System.Object[] parameters) [0x00000] in <d772a4bbe86c4dc5b425d8ca91786b91>:0 at Java.Interop.TypeManager.CreateProxy (System.Type type, System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x0001b] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Interop.TypeManager.CreateInstance (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type targetType) [0x00111] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object.GetObject (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer, System.Type type) [0x00023] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object._GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00017] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Java.Lang.Object.GetObject[T] (System.IntPtr handle, Android.Runtime.JniHandleOwnership transfer) [0x00000] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at Android.Widget.ArrayAdapter.CreateFromResource (Android.Content.Context context, System.Int32 textArrayResId, System.Int32 textViewResId) [0x0006d] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at AndroidApp1.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x00031] in <51ce4ed05744482eb8a8079a399a17d2>:0 at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in <43cddc76fe22432dbdbcea2397b6fcd7>:0 at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.3(intptr,intptr,intptr) This commit adds synchronization of the `SkipInJavaToManaged` property which results in the sample attached to the GitHub issue to work properly. Note: for some weird reason the error occurred *only* with the *Release* build of `Mono.Android.dll` and *only* with `$(TargetFrameworkVersion)`=v9.0 (API-28); if the app used any other framework version it would not fail. I can't see why this would be so since the relevant code was very similar between v9.0 and other frameworks and it was *identical* in case of the *Debug* build of the v9.0 framework.
Release status update A new Preview version of Xamarin.Android has now been published that includes the fix for this item. The fix is not yet included in a Release version. I will update this again when a Release version is available that includes the fix. Fix included in Xamarin.Android 11.0.0.3. Fix included on Windows in Visual Studio 2019 version 16.7 Preview 4. To try the Preview version that includes the fix, check for the latest updates in Visual Studio Preview. Fix included on macOS in Visual Studio 2019 for Mac version 8.7 Preview 4. To try the Preview version that includes the fix, check for the latest updates on the Preview updater channel. |
Release status update A new Release version of Xamarin.Android has now been published that includes the fix for this item. Fix included in Xamarin.Android SDK version 11.0.0.3. Fix included on Windows in Visual Studio 2019 version 16.7. To get the new version that includes the fix, check for the latest updates or install the most recent release from https://visualstudio.microsoft.com/downloads/. Fix included on macOS in Visual Studio 2019 for Mac version 8.7. To get the new version that includes the fix, check for the latest updates on the Stable updater channel. |
Context: #4596
Context: #4660
For this particular test case, the issue only occurs when using the shared runtime or when the managed linker is disabled.
Partial workaround
Steps to reproduce
adb
is running.Test case: ArrayAdapterApp1.zip
Expected behavior
When built and deployed with Xamarin.Android 10.2, the application launches successfully and displays Hello World! in the center of the view.
Actual behavior
When built and deployed with Xamarin.Android 10.3, the application exits during launch:
Version information
The issue also occurs with Visual Studio 2019 version 16.7 Preview 2:
The text was updated successfully, but these errors were encountered: