MAUI:如何在 SingleProject 中将部分类与 net7.0 作为 TargetFramework 一起用于特定于平台的实现?

Jul*_*ian 6 .net c# maui .net-maui

我正在使用部分类在 .NET MAUI 应用程序中实现特定于平台的行为:

干:

public partial class MyServices
{
    public partial void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

Android/iOS/MacCatalyst/Windows/Tizen 特定实现都与此类似:

public partial class MyServices
{
    public partial void DoSomething()
    {
        // Android/iOS/MacCatalyst/Windows/Tizen specific implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,对于 MAUI 来说很正常(尽管特定于平台的实现可以以不同的方式完成,但是部分类方法对于 MAUI 来说很常见并且看起来很方便)。

现在,为了能够执行单元测试 (xUnit),需要将目标添加net7.0SingleProject.csproj<TargetFrameworks>文件中,如下所示:

<PropertyGroup>
    <TargetFrameworks>net7.0;net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
    <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>

    <!-- skipping irrelevant stuff here... -->

    <OutputType Condition="'$(TargetFramework)' != 'net7.0'">Exe</OutputType>
    
    <!-- skipping irrelevant stuff here... -->
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

这正如 Gerald Versluis 在他的YouTube 视频中所描述的那样。相关代码示例可以在这里找到:https://github.com/jfversluis/MauixUnitTestSample/blob/main/MauixUnitTestSample/MauixUnitTestSample.csproj#L5

这就是我的问题开始的地方:

由于net7.0目标和类的缺失实现MyServices,我现在收到此编译器错误:

CS8795 部分方法“MyServices.DoSomething()”必须具有实现部分,因为它具有可访问性修饰符。我的样本应用程序 (net7.0)

我还没有找到任何方法来为MyServices目标部分类添加(虚拟)实现net7.0。但是,我无法删除net7.0目标,因为那样我就无法再运行单元测试了。

Jul*_*ian 4

感谢 Gerald Versluis,我根据MA​​UI CommunityToolkit 的StatusBar 实现找到了它。所以,这是我的解决方案:

我改变了一种稍微不同的方法。我没有将部分类添加到平台文件夹,而是添加了一个新的文件夹和命名空间,并使用基于文件名的多目标,如下所述:https: //learn.microsoft.com/en-us/dotnet/maui/platform-集成/配置多目标#配置基于文件名的多目标

我的实现文件现在都在同一个文件夹中:

Services/Platform/
    MyServices.shared.cs
    MyServices.android.cs
    MyServices.ios.cs
    MyServices.windows.cs
    MyServices.net.cs
Run Code Online (Sandbox Code Playgroud)

MyServices.shared.cs文件包含方法声明,而特定于平台的实现则驻留在特定于平台的文件中

.csproj中,我在节点内添加了以下内容<Project>

Services/Platform/
    MyServices.shared.cs
    MyServices.android.cs
    MyServices.ios.cs
    MyServices.windows.cs
    MyServices.net.cs
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力,我也可以运行单元测试。完美的设置。