DotNETWeekly-io / DotNetWeekly

DotNet weekly newsletter
MIT License
207 stars 3 forks source link

【文章推荐】如何处理不同平台支持的代码 #707

Closed gaufung closed 2 months ago

gaufung commented 2 months ago

https://weblog.west-wind.com/posts/2024/Jul/18/Dealing-with-Platform-Specific-Classes-and-Methods-in-CrossPlatform-NET

gaufung commented 2 months ago

image

.NET 开源后一直声明式跨平台的开发语言,但是由于一些历史原因,部分 API 仍然是 Windows 独有的,那么如果在代码中使用了他们,就会得到一个编译的时候的警告或者错误,那么该怎么解决他们呢?有三种方法

  1. 忽略错误

如果编译发出警告的信息,可以通过在上下文见天 #pragma 来关掉警告

#pragma warning disable CA1416
            Type type = Type.GetTypeFromProgID(progId);
#pragma warning restore CA1416

或者在 csproj 文件中添加 NoWarn 的属性

<PropertyGroup>
  ...
  <NoWarn>CA1416</NoWarn>
</PropertyGroup>
  1. 配置 SupportedOSPlatform

在使用的方法中添加 SupportedOSPlatform 的注解

[SupportedOSPlatform("windows")]
public static object CreateComInstance(string progId)
{
    Type type = Type.GetTypeFromProgID(progId);
    if (type == null)
        return null;

    return Activator.CreateInstance(type);
}

在这个这种情况下,如果项目的运行时包含了 Windows, 那么就不会出现编译警告

<TargetFramework>net8.0-windows</TargetFramework>
  1. 配置单独的库

另外一种方式将 Windows 相关的代码按照条件编译单独设置

#if NETFRAMEWORK   // .NET Framework only
...
#endif

在这里,只有 .NET Framework 运行时才看到相关的方法的定义。