Вы можете использовать сборку.загрузить в есть некоторые подробности?


В настоящее время я пытаюсь динамически загрузить сборку плагина в приложении monotouch.

Для этого я ссылаюсь на dll плагина в моем проекте приложения, устанавливая ограничитель в "sdk only", а затем пытаюсь вызвать Assembly.Load(filename) в моем приложении, когда требуется плагин.

Это тот же самый подход, который я ранее успешно использовал в monodroid. Однако в настоящее время это не удается в monotouch с FileLoadException.

Возможен ли такой подход в monotouch? Есть ли специальный путь к файлу, который вам нужно включить? Или это не поддерживается в среде aot?


Примечание: очевидно, есть и другие способы добиться подобного эффекта - и у меня есть запасной план... но это мой предпочтительный маршрут (если я могу заставить его работать)

2 3

2 ответа:

Код типа:

var a = Assembly.Load ("mscorlib.dll");
Assert.NotNull (a);

Прекрасно работает как с симулятором, так и с устройствами. Однако параметр для Load является assemblyString, который является не именем файла (даже если вызванное исключение заставляет вас думать, что это так).

Существует много других перегрузок (для Load) и другие методы тоже (например, LoadFrom), но они не все могут работать внутри MonoTouch (так как некоторая поддержка времени выполнения может отсутствовать).

Примечание

Обработка mscorlib.dll является специальной (и работает в большем количестве случаев чем другие сборки, то есть ярлыки). Однако методы, основанные на отражении, как представляется, работают, как и ожидалось, в большем числе случаев, например:

string filename = System.IO.Path.GetFileName (GetType ().Assembly.Location);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom (filename);

Сборка.Загрузка (или любой другой способ динамической загрузки кода) не поддерживается в MonoTouch.

Это ограничение iOS - весь исполняемый код должен быть в приложении (и это должен быть машинный код, поэтому мы используем AOT для генерации машинного кода во время компиляции).