Как выполнить привязку к системной платформе с помощью Xamarin.Mac?

Я занимаюсь созданием приложения для взаимодействия со смарт-картами. Для этого я хотел бы использовать CryptoTokenKit Framework, который является стандартным для Mac (расположен в /System/Library/Frameworks/CryptoTokenKit.framework).

Эта ссылка говорит о возможности привязки фреймворков к проекту Mac: https://developer.xamarin.com/guides/cross-platform/macios/native-references/

Я создал файл ApiDefinition.cs и файл StrucsAndEnums.cs, используя следующую команду Sharpie:

Я не могу найти в Интернете информацию о том, как реализовать вышеупомянутые файлы и начать использовать фреймворк.


person Koen Hendriks    schedule 25.10.2017    source источник


Ответы (1)


Создайте проект привязки Xamarin.Mac в решении.

Добавьте NativeReference к:

/System/Library/Frameworks/CryptoTokenKit.framework

Свяжите его с помощью sharpie:

sharpie bind \
    -o CryptoTokenKitFramework \
    -namespace CryptoTokenKit \
    -sdk macosx10.13 \
    -f /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CryptoTokenKit.framework

Существует несоответствие между шаблоном проекта привязки и выводом Sharpie, поэтому вы можете либо удалить ApiDefinition.cs и добавить ApiDefinitions.cs, либо просто перезаписать созданный шаблон:

mv CryptoTokenKitFramework/ApiDefinitions.cs CryptoTokenKitFramework/ApiDefinition.cs

Будет ряд атрибутов, таких как (версии будут меняться по ним):

[Watch (4,0), TV (11,0), Mac (10,12), iOS (10,0)]

Поскольку это частные фреймворки для iOS, Watch, TV, удалите эти платформы. Оставьте атрибут Mac и исходную версию:

[Mac (10,11)]

Примечание: PlatformAttribute устарел, но sharpie все еще использует его (при условии обратной совместимости версий(?)), поэтому вы можете использовать Introduced, если действительно хотите очистить вывод сборки:

[Introduced (PlatformName.MacOSX, 10, 11, PlatformArchitecture.Arch64)]

Будет несколько атрибутов [Verify], которые необходимо пересмотреть/исправить. то есть TKSmartCardUserInteraction.Cancel и TKSmartCardSlot.MakeSmartCard должны быть методами, а не свойствами.

Пример/сгенерировано:

// -(TKSmartCard * _Nullable)makeSmartCard;
[NullAllowed, Export ("makeSmartCard")]
[Verify (MethodToProperty)]
TKSmartCard MakeSmartCard { get; }

Исправлено:

// -(TKSmartCard * _Nullable)makeSmartCard;
[NullAllowed, Export("makeSmartCard")]
TKSmartCard MakeSmartCard();

Исправьте остальные атрибуты [Verify] и ошибки компилятора, есть куча неверных сигнатур методов, указателей, возвращаемых типов и т. д., которые сгенерированы и нуждаются в исправлении.

Примечание. ЧТОБЫ облегчить себе жизнь, убедитесь, что вы используете последнюю версию Sharpie:

Version:  3.4.0
SHA1:     c12859dac8d43121b5a9ed866a0db8409f9df817
URL:      https://dl.xamarin.com/objective-sharpie/ObjectiveSharpie-3.4.0.pkg
person SushiHangover    schedule 25.10.2017
comment
Спасибо за ответ на мой вопрос @SushiHangover. Есть ли причина, по которой вы используете фреймворк в Xcode с Sharpie, но добавляете системный фреймворк в качестве ссылки? - person Koen Hendriks; 26.10.2017
comment
Я получаю сообщение об ошибке, когда хочу скомпилировать: /Users/Koen/Developer/poc_digid/CryptoTokenKitFramework/CryptoTokenKitFramework/BTOUCH: Error BI1017: bgen: Не знаю, как сделать подпись для Security.SecCertificate в параметре `certificateRef' из CryptoTokenKitFramework .TKTokenKeychainCertificate.Constructor (BI1017) (CryptoTokenKitFramework) - person Koen Hendriks; 26.10.2017
comment
В следующем фрагменте кода: gist.github.com/anonymous/0d1aad180c111b726be1ec14dddd564e - person Koen Hendriks; 26.10.2017
comment
@KoenHendriks Платформа, предоставляемая ОС, установлена ​​всеми, но в версии Xcode есть заголовки, необходимые шулеру. - person SushiHangover; 26.10.2017