Динамически загружаемые сборки для Xamarin. Формы для Android не находят рендерер

Я программирую клиент-серверное приложение для Android с Xamarin.Forms. Это приложение должно иметь возможность загружать дополнительные элементы управления при подключении к серверу.

Я успешно нашел способ загрузить сборки с сервера, загрузить их с помощью Assembly.Load() и запустить код этого.

Моя текущая проблема заключается в том, что у меня есть два типа сборок. Некоторые переносимые расширения Xamarin.Forms, а также соответствующие сборки Android, которые содержат средства визуализации для переносимых "элементов управления".

Поскольку средства визуализации связаны с "элементами управления" Xamarin.Forms через код, подобный этому

[assembly: ExportRenderer(typeof(MyNewControl), typeof(MyNewControlRenderer)]

каждое приложение должно работать

Forms.Init(this, bundle);

в методе OnCreate () объекта MainActivity. Эта форма Init может быть вызвана только один раз для приложения, потому что второй вызов ничего не сделает после завершения инициализации. Я должен признаться, что это грязный код, но я не нашел официального пути, поэтому будьте терпеливы со мной. В ходе исследования кода Xamarin.Forms я узнал, что этот метод 'Init ()' на самом деле вызывает

Internals.Registrar.RegisterAll(new[]{ typeof(ExportRendererAttribute), typeof(ExportCellAttribute), typeof(ExportImageSourceHandlerAttribute) });

Итак, я использовал Reflection для повторного вызова этой функции после загрузки всех моих дополнительных сборок. после этого использование дополнительных элементов управления сработало впервые. Но что-то случилось после этого сейчас, когда я использую некоторые из этих элементов управления, я получу исключение

`java.lang.ClassNotFoundException: Didn't find class "md559d725e3280243c70c47dd021f85c3f6.MyNewControlRenderer" on path: DexPathList[[zip file "/data/app/MyApp.apk"],nativeLibraryDirectories=[/data/app-lib/MyApp, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
    at md5b60ffeb829f638581ab2bb9b1a7f4f3f.ButtonRenderer_ButtonClickListener.n_onClick(Native Method)
    at md5b60ffeb829f638581ab2bb9b1a7f4f3f.ButtonRenderer_ButtonClickListener.onClick(ButtonRenderer_ButtonClickListener.java:30)
    at android.view.View.performClick(View.java:4438)
    at android.view.View$PerformClick.run(View.java:18422)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread`

Итак, два моих главных вопроса: 1) Как существует официальный способ расширения элементов управления Xamarin.Forms посредством динамически загружаемых сборок на Android, если таковые имеются? 2) если не существует такого способа, что я могу сделать, чтобы исправить мою проблему тем или иным, не официальным способом?

Это мой первый вопрос, и английский не является моим родным языком, так что, возможно, я допустил некоторые ошибки, наверняка я забыл предоставить соответствующую информацию. Пожалуйста, исправьте меня, где это необходимо, и я с нетерпением жду некоторых комментариев.

1 ответ

1) Как существует официальный способ расширения элементов управления Xamarin.Forms с помощью динамически загружаемых сборок на Android, если таковые имеются? 2) если не существует такого способа, что я могу сделать, чтобы исправить мою проблему тем или иным, не официальным способом?

Если я правильно понимаю, вам нужно создать собственный плагин для Xamarin и управлять загрузкой сборок через пакет nuget.

Вы можете скачать плагин для шаблонов Xamarin здесь. И для этого шаблона есть шаблон с именем Control plugins for Xamarin.Forms, которые соответствуют вашим требованиям.

Для использования Control plugins for Xamarin.FormsВы можете обратиться к разделу "Создание плагинов управления для Xamarin Video".

Обновить:

Невозможно внедрить ваш пользовательский рендерер во время выполнения и использовать его без каких-либо проблем. Когда вы используете свой пользовательский элемент управления, CLR все равно попытается загрузить класс визуализации этого элемента управления, но потому что ваша сборка была загружена во время выполнения. Метаданные вашей сборки никогда не будут доступны системе. Таким образом, система никогда не сможет найти ваш класс рендерера.

Другие вопросы по тегам