Span<T> 和朋友不在 .NET Native UWP 应用程序中工作

Posted

技术标签:

【中文标题】Span<T> 和朋友不在 .NET Native UWP 应用程序中工作【英文标题】:Span<T> and friends not working in .NET Native UWP app 【发布时间】:2018-09-28 17:07:34 【问题描述】:

重现步骤:

    使用最新更新打开 Visual Studio 2017。 在 10240 中创建一个 UWP 项目(这不是强制性的,它在所有构建中都已损坏) 从 nuget 包安装 System.Memory(单击包含预发布版)

    将此代码复制粘贴到 MainPage.cs 中

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    
       void Recursive(ReadOnlySpan<char> param)
       
           if (param.Length == 0) return;
    
           tx1.Text += Environment.NewLine;
    
           tx1.Text += new string(param.ToArray());
           Recursive(param.Slice(1));
       
    
       ReadOnlySpan<char> mySpan = "Why things are always broken in Visual Studio".AsSpan();
    
       Recursive(mySpan);
    
    

    复制粘贴到 MainPage.xaml

    <Grid Background="ThemeResource ApplicationPageBackgroundThemeBrush">
       <TextBlock x:Name="tx1" HorizontalAlignment="Left"   FontSize="48" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
    </Grid>
    

    从 Debug 切换到 Release x64 并确保“使用 .Net Native 工具链编译”。

    点击播放。

    收到此错误:

------ 构建开始:项目:App12,配置:Release x64 ------ App12 c:\Users\myuser\documents\visual studio 2017\Projects\App12\App12\bin\x64\Release\App12.exe 处理应用程序代码 C:\Users\myuser.nuget\packages\microsoft.net.native.compiler\1.7.3\tools\Microsoft.NetNative.targets(697,5):错误:内部编译器错误:对象引用未设置为一个对象。 ========== 构建:0 成功,1 失败,0 最新,0 跳过 ========== ========== 部署:0 成功,0 失败,0 跳过 ==========

我做错了什么?这适用于没有 .NET Native 的调试和发布。谢谢。

【问题讨论】:

Span&lt;T&gt; 和朋友们”,你是怎么得出这个结论的?如果删除这些引用,它会编译吗?没有递归怎么办? 如果我删除 System.Memory 和这个 Span 代码,应用程序将在 .Net Native 中编译。如果您按照步骤操作,它将无法编译。如果我删除递归它也不起作用。这是 nuget 包。 这种情况是否也会发生在例如char[] 类型? 如果我删除 Span 代码并添加 char[] 就可以了。所以问题是 System.Memory Span 和朋友的事情。 “内部编译器错误”消息表明您将其发布到 .net 本机问题跟踪器可能会更好。 【参考方案1】:

System.Memory 处于预发布状态,尚不适用于 .NET Native。 .NET Native 编译器的下一版本将支持此功能。

https://github.com/dotnet/corert/issues/5725

【讨论】:

以上是关于Span<T> 和朋友不在 .NET Native UWP 应用程序中工作的主要内容,如果未能解决你的问题,请参考以下文章

选择不在锚点中的跨度

inline-block 样式问题(不在一行,间距)

C# 7.2 中的 Span<T> 和 Memory<T> 有啥区别?

.NET点滴:Span<T;

如何使用 Span<T> 和 stackalloc 创建临时小列表

在 C# 中使用 Span<T; 和 Memory<T; 编写高性能代码