Цель для нескольких фреймворков Xamarin

#c# #xamarin #xamarin.forms #multitargeting

Вопрос:

Доброе утро

Я создаю пакет для Xamrin.Формы. Я слежу за тем, как это сделано Джеймсом Монтенанго

Вот некоторые важные фрагменты моего .csproj

 <TargetFrameworks>netstandard2.0;MonoAndroid10.0;Xamarin.iOS10</TargetFrameworks>

  <ItemGroup>
    <Compile Include="***.shared.cs" />
  </ItemGroup>

  <ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) ">
    <PackageReference Include="XTricks.Shared" Version="1.0.1" />
    <PackageReference Include="Xamarin.Essentials" Version="1.6.1" />
  </ItemGroup>

  <ItemGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) ">
    <PackageReference Include="Xamarin.Forms" Version="5.0.0.2196" />
    <PackageReference Include="Xamarin.GooglePlayServices.Location" Version="118.0.0.1" />
    <PackageReference Include="XTricks.Shared" Version="1.0.1" />
    <PackageReference Include="Xamarin.Essentials" Version="1.6.1" />
    <Compile Include="***.android.cs" />
  </ItemGroup>

  <ItemGroup Condition=" $(TargetFramework.StartsWith('Xamarin.iOS')) ">
    <PackageReference Include="Xamarin.Essentials" Version="1.6.1" />
    <PackageReference Include="XTricks.Shared" Version="1.0.1" />
    <Compile Include="***.apple.cs" />
  </ItemGroup>
 

Все работает, кроме одной важной вещи.
Я хотел бы иметь две реализации одного и того же класса для Android и для iOS.

Для этой цели я объявляю и интерфейс как:

 IMyService.shared.cs
 

И я создаю два класса, один в папке Android под названием:
MyService.android.cs, который реализует IMyService.shared.cs
и второй в папке Apple, называется MyService.apple.cs.

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

         private static IMyService Service
        {
            get
            {
#if NETSTANDARD1_0 || NETSTANDARD2_0
                return null;
#else
                return new MyService(); // And this code is red one. MyService cannot be found. 
#endif
            }
        }
 

По сути, я застрял там. Кто-нибудь знает, как двигаться дальше?

Комментарии:

1. Помогает ли эта статья ? Внедрение зависимостей — это самый простой способ разрешить класс обслуживания, зависящий от платформы.

2. @AndrewH спасибо, однако это не решение этой проблемы

3. Это именно то решение, которое вы представили проблему: «Я хотел бы иметь две реализации одного и того же класса для Android и для iOS». Если у вас другая проблема, пожалуйста, обновите вопрос.

Ответ №1:

Убедитесь, что у вас одинаковое пространство имен для MyService класса с вашими общими кодами, а затем вы просто создаете свою библиотеку.