如果通过 WinRT ABI 传递,则警告修剪和 AOT 兼容性不安全(列表<T>)

问题描述 投票:0回答:1

我有一个简单的 .NET 8 (C#) 类库,可以读取一些注册表值。

它是在 MS VS 2022 上创建和构建的。

项目文件:

<PropertyGroup>
    <TargetFramework>net8.0-windows10.0.26100.0</TargetFramework>
    <ImplicitUsings>disable</ImplicitUsings>
    <Nullable>enable</Nullable>
</PropertyGroup>

方法:

public static RegistryKey? GetRegistryKey () =>
    Registry
        .CurrentUser
        .OpenSubKey("Software")
        ?.OpenSubKey("ODBC")
        ?.OpenSubKey("ODBC.INI")
        ?.OpenSubKey("ODBC Data Sources");

public static IEnumerable<string> GetDataSources1 ()
{
    using var key = DataProviderOdbc.GetRegistryKey();
    {
        // Only the following line causes the warning (listed below).
        return (key?.GetValueNames()?.ToList() ?? []);
    }
}

public static string [] GetDataSources2 (RegistryKey? key)
    => key?.GetValueNames() ?? [];

public static IEnumerable<string> GetDataSources3 (RegistryKey? key)
    => key?.GetValueNames()?.ToList() ?? [];

public static IEnumerable<string> GetDataSources4 ()
    => DataProviderOdbc.GetRegistryKey()?.GetValueNames()?.ToList() ?? [];

Code: CsWinRT1030
Type 'System.Collections.Generic.List<string>' implements generic WinRT interfaces which requires generated code using unsafe for trimming and AOT compatibility if passed across the WinRT ABI. Project needs to be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'.

我不明白为什么只有第一个名为

GetDataSources1
的实现才会导致上述警告。起初,我认为这是一个综合警告,因此我尝试对所有组合中的方法进行重新排序和注释。我徒劳地清理并重建了解决方案。

该库充满了 T[]、IEnumerable、LIST 等之间的隐式和显式转换。为什么只有这一行?我一定是在做一些愚蠢的事情。我缺少什么?为什么我/应该考虑标记程序集以允许不安全代码?

附带问题:这是否与注册表有任何关系(我假设没有)?我对 WinRT 桥了解不多,也不知道为什么要在这里考虑。任何对此警告含义的了解也将不胜感激。

c# .net registry compiler-warnings .net-8.0
1个回答
0
投票

我也有类似的问题。发现这个:更新到 VS 17.11.5 后项目无法构建 看看: https://developercommunity.visualstudio.com/t/Project-fail-to-build-after-update-to-VS/10763457?sort=active&openOnly=false&closeOnly=false&topics=数据库+解决方案

希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.