Xamarin iOS привязка, символ не найден в библиотеке
Мне нужен был элемент управления эскизом / рисованием для моего проекта Xamarin.iOS, и хотя я не мог найти один совместимый с C#, я нашел хороший компонент, написанный на Objective C. https://github.com/acerbetti/ACEDrawingView
Я делал привязки Xamarin раньше, поэтому я надеялся, что этот процесс будет довольно простым, но, к сожалению, я столкнулся с несколькими препятствиями на этом пути.
Я начал создавать свою статическую библиотеку и использовал скрипт сборки ant для создания двоичного файла FAT для устройств и симулятора:
фрагмент моего сценария муравья
AceDrawingViewSDK.a: libAceDrawingView-i386.a libAceDrawingView-armv7.a libAceDrawingView-armv7s.a libAceDrawingView-arm64.a xcrun -sdk iphoneos lipo -create -output $@ $^
Далее я побежал
sharpie bind --sdk=iphoneos10.1 *.h
в файлах заголовков, чтобы получить мои файлы ApiDefinitions, Structs и Enum.
Я проверил и удалил атрибуты проверки. (Они все выглядели хорошо.) Но именно здесь начались некоторые другие мои проблемы.
The type ACEDrawingLabelViewTransform' already contains a definition forTransform' (CS0102) (AceDrawingViewBinding).
Ради просто попытки двигаться дальше и заставить что-то работать, я просто закомментировал эту ссылку.
Затем я получил несколько проблем, подобных этому:
The type or namespace name `IACEDrawingTool' could not be found. Are you missing an assembly reference? (CS0246) (AceDrawingViewBinding)
Я подумал, что это связано с этим:
// @interface ACEDrawingPenTool : UIBezierPath
[BaseType(typeof(UIBezierPath))]
interface ACEDrawingPenTool : IACEDrawingTool
и это:
// @protocol ACEDrawingTool
[Protocol, Model]
[BaseType(typeof(NSObject))]
interface ACEDrawingTool
Я попытался исправить это, сделав имя интерфейса непротиворечивым (я попробовал и IACEDrawingTool, и ACEDrawingTool.) Это позволило обойти эту ошибку и позволить мне скомпилировать
Одно из моих перечислений вышло как
[Native]
public enum ACEDrawingMode : nuint
{
Scale,
OriginalSize
}
Я не мог найти, как обработать [Native] в этом случае (поэтому еще раз, для тестирования, я удалил его.) Я попытался использовать удаление nuint из enum и использование uint. Любой подход, казалось, исправил ошибку.
Таким образом, с исправлением этих ошибок я смог сгенерировать.dll из моего связующего проекта и добавить его в свой основной проект.
Теперь я получаю еще 2 проблемы.
Если я соберу и разверну в симуляторе, я смогу запустить свое приложение до того момента, пока не попытаюсь создать новый экземпляр ACEDrawingView из привязки. Я получил:
Could not create an native instance of the type 'ACEDrawingView': the native class hasn't been loaded.
It is possible to ignore this condition by setting ObjCRuntime.Class.ThrowOnInitFailure to false.
Если я пытаюсь собрать и развернуть на своем телефоне, я получаю различные ошибки на этапе сборки, которые вообще не позволяют запустить его на устройстве:
MTOUCH: error MT5211: Native linking failed, undefined Objective-C class: ACEDrawingArrowTool. The symbol 'OBJC_CLASS$ACEDrawingArrowTool' could not be found in any of the libraries or frameworks linked with your application.
MTOUCH: error MT5211: Native linking failed, undefined Objective-C class: ACEDrawingDraggableTextTool. The symbol '_OBJC_CLASS$ACEDrawingDraggableTextTool' could not be found in any of the libraries or frameworks linked with your application.
MTOUCH: error MT5211: Native linking failed, undefined Objective-C class: ACEDrawingEllipseTool. The symbol '_OBJC_CLASS$_ACEDrawingEllipseTool' could not be found in any of the libraries or frameworks linked with your application.
...и так далее.
Я попытался вернуться, перечитать и повторить шаги и безуспешно пытался повторно использовать некоторые сценарии и настройки из моих предыдущих успешных привязок.
У кого-нибудь есть предложения относительно того, что может решить эти проблемы?
1 ответ
Имя типа или пространства имен `IACEDrawingTool'не найдено.
Добавить новый интерфейс, как это interface IACEDrawingTool{ }
public enum ACEDrawingMode: nuint
Изменить nuint
в ulong