Как использовать файлы iOS .framework в .NET 8.0 MAUI

Может ли кто-нибудь создать библиотеку привязки, которая использует .framework, а НЕ статическую библиотеку «.a», вместе с рабочей демонстрацией MAUI, которая использует библиотеку привязки, чтобы мы могли закрыть эту проблему и покончить с ней?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Шаг 1:

Создайте такую ​​структуру папок:

App/ (.NET 8.0, MAUI)
│   App.csproj
│   ...
App.Binding/ (iOS/MacCatalyst Binding Library)
│   ApiDefinition.cs
│   App.Binding.csproj
│   StructsAndEnums.cs
App.Frameworks/ (created by hand)
└───FAT
└───Frameworks

Шаг 2:

Скопируйте .framework(s) в каталог App.Frameworks/FAT/ и App.Frameworks/Frameworks/.

Шаг 3:

Создайте структуру FAT из этих структур. Обратите внимание, что вы можете добавить более одной платформы в структуру FAT, если они предназначены для разных архитектур.

lipo -create -output App.Frameworks/FAT/[Name].framework/[Name] App.Frameworks/Frameworks/[Name].framework/[Name] ...

Шаг 4:

Используйте Sharpie, чтобы сгенерировать ApiDefinition.cs и StructsAndEnums.cs.

Примечания:

  1. Возможно, вам придется запустить эту команду с повышенными разрешениями (например, sudo), если вы используете платформы Apple в качестве импорта.
  2. Возможно, вам придется изменить пути импорта в файлах заголовков на относительные пути, например. г. от #import <MyFramework/MyFrameworkExt.h> до #import "MyFrameworkExt.h" (в этом случае оба заголовка будут находиться в одном каталоге)
  3. Этот пример предназначен для iOS, но должен быть аналогичен для MacCatalyst.
sharpie bind --sdk=iphoneos16.2 --output = "ApiDefinition" --namespace = "App.Binding" --scope = "App.Frameworks/FAT/[Name].framework/Headers/" "App.Frameworks/FAT/[Name].framework/Headers/[Name].h"

Шаг 5:

Скопируйте части вновь созданных файлов, найденных в каталоге ApiDefinitions, которые понадобятся вам для привязок, в следующие файлы:

  • App.Binding/ApiDefinition.cs
  • App.Binding/EnumsAndStructs.cs

Шаг 6:

Удалите любой атрибут [Verify] из файлов в привязке, поскольку они будут вызывать ошибки, и удалите директиву using в самом верху файла App.Bindings/ApiDefinition.cs, которая относится к платформе, которую вы связываете.

Шаг 7:

Примечания:

  1. Если вы используете MacCatalyst, вам необходимо изменить пути к местоположению в флагах компоновщика.
  2. Проверьте, какие фреймворки вы используете, в теге <Frameworks> и измените их под свои нужды.

Обновите свой App.Binding/App.Binding.csproj, добавив следующее:

<ItemGroup>
    <NativeReference Include = "..\Frameworks\FAT\[Name].framework">
        <Kind>Framework</Kind>
        <Frameworks>Foundation UIKit [Name]</Frameworks>
        <LinkerFlags>-L "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphonesimulator/" -L "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos" -Wl,-rpath -Wl,@executable_path/Frameworks</LinkerFlags>
    </NativeReference>
</ItemGroup>

Шаг 8:

Обновите файл App/App.csproj, чтобы загрузить проект привязки.

Примечания:

  1. Вы можете рассмотреть возможность добавления условной загрузки ссылки
  2. Несмотря на то, что вы связываете ссылку на проект, некоторые IDE требуют создать привязку вручную, а затем выгрузить проект привязки, чтобы отобразить завершение кода и принять директиву using в других файлах.
<ItemGroup>
    <ProjectReference Include = "..\App.Binding\App.Binding.csproj"/>
</ItemGroup>

Надеюсь, это поможет вам, и я не пропустил ни одного шага. Если у вас есть какие-либо вопросы, просто дайте мне знать!

БР, Нико

«Некоторые IDE требуют создать привязку вручную, а затем выгрузить проект привязки, чтобы отобразить завершение кода и принять директиву using в других файлах». Я думаю, мы это видим. Библиотека привязки собирается, и я вижу общедоступные типы через обозреватель объектов, но они не могут быть скомпилированы, и оператор using не работает. В Xamarin Forms мы ссылались только на DLL. Вы предлагаете вместо этого ссылаться на CSPROJ?

Pat Long - Munkii Yebee 04.07.2024 22:35

Вот как я заставил это работать. Создайте ссылку на .csproj, создайте его вручную, выгрузите проект привязки, сохраняя при этом ссылку на .csproj. Звучит странно, но похоже, что сборка во время разработки не включает сгенерированные источники привязки.

Niko Klemm 05.07.2024 11:11

Когда вы говорите «собрать вручную», вы имеете в виду из командной строки или щелчок правой кнопкой мыши по конкретному проекту в обозревателе решений и нажатие «Перестроить»?

Pat Long - Munkii Yebee 05.07.2024 11:14

ОБНОВЛЯТЬ. Это безумие. Я только что собрал CSPROJ (как вы сказали), затем выгрузил его, и все заработало?????

Pat Long - Munkii Yebee 05.07.2024 11:20

Обычно я просто использую контекстное меню проекта и выбираю сборку/перестройку. Так у тебя всё заработало? :D

Niko Klemm 05.07.2024 13:40

Да, но он кажется таким хрупким. Большое спасибо за вашу помощь. Ты действительно старался изо всех сил. Очень признателен

Pat Long - Munkii Yebee 05.07.2024 16:17

Мне кажется это не правильно, но в итоге в обычной сборке все точно так же. Это просто вопрос времени проектирования. Надеюсь, это будет исправлено в ближайшее время. И конечно, в любое время!

Niko Klemm 05.07.2024 20:20

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