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.0到SingleProject的.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目标,因为那样我就无法再运行单元测试了。
感谢 Gerald Versluis,我根据MAUI 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)
它就像一个魅力,我也可以运行单元测试。完美的设置。