代码在 .Net 5 中有效,但在 .Net 6 中无效

Posted

技术标签:

【中文标题】代码在 .Net 5 中有效,但在 .Net 6 中无效【英文标题】:Code works in .Net 5 but doesn't work in .Net 6 【发布时间】:2021-08-19 23:09:24 【问题描述】:

我已经通过 Visual Studio 反馈工具报告了这个可能的错误,但我有以下示例代码在 .Net 5 中运行,但在 .Net 6 中无法正常工作,我觉得这要么是错误,要么是我我错过了在版本之间发生变化的东西。我有下面的示例代码以及使用两种方法的 Visual Studio html 可视化器的 html 输出。有人对此问题有任何可能的意见吗?

更新:由于@GSerg 的有用建议,通过不同的测试,我发现这个错误只发生在.Net 6 中,当您在字符串插值或字符串构建器中使用 html 标记时,它会在插入变量之前截断文本并将其插入第二行。我附上了一张使用 Visual Studio 可视化工具显示此行为的新屏幕截图。

var subect = "Subect Example";
var test = $"<p><strong><span style=\"font-size: 20px;\">subject</span></strong></p><p><span style=\"color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; " +
           $"font-size: small; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; " +
           $"text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; " +
           $"text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;\">The following information is in beta testing and isn't meant for a live portfolio. " +
           $"Use this information for paper trading only until further notice.</span></p>";

.Net 5 HTML 输出:

.Net 6 HTML 输出:

.Net 6 文本输出:

【问题讨论】:

我怀疑这与StringBuilder 有什么关系。您用来显示字符串的任何控件似乎都已更改。很可能,它会转义输入以防止注入攻击。 来自文档:'查看 HTML 字符串数据 格式良好的 HTML 字符串看起来就像在浏览器中呈现一样,如下图所示。格式错误的 HTML 可能会显示为纯文本。'您的 test 变量不包含有效的 html,(缺少 标记)因此它的行为符合预期。 @GSerg 是的,正确。首先,即使我删除了字符串生成器,它仍然会发生。我正确使用了字符串生成器,但没有粘贴我的完整代码,因为我只想在这里为每个人粘贴一个 minimul 可重现的示例。当我删除字符串生成器并且只留下连接时,它仍然会发生。当我重新启动计算机时,它仍然会发生。但是,当我删除字符串插值时,它可以工作。我最好的猜测是字符串插值在最新的 .Net 中存在错误,因为该问题仅在使用字符串中的 html 代码时发生。运行我的代码,自己看看 @AlexeiLevenkov 这是一个最小可重现示例的定义。您只需要 Visual Studio,只需将此代码粘贴到基本控制台应用项目中 @DarthVegan 您可能想编辑您的问题以反映您的发现(删除字符串生成器的提及,解释它是字符串插值,并明确提及 VS vizualizer)。在“哑”视图(Locals 窗口或 Debug.Print)中看到的实际字符串内容是什么?它真的有第一行吗? 【参考方案1】:

这似乎是 Visual Studio 2022 中的一个错误,它仍处于预览阶段,因此并不意外。 虽然此错误未修复,但您可以使用 dotnet cli 构建作为解决方法。

以下代码重现了该错误

string two= "2";
string test = $"1 two 3" 
    + $" 4" 
    + $" 5";
Console.WriteLine(test);

使用 Visual Studio 2022 预览版 3.1 将此代码构建为 .NET 6.0 时,代码将编译为

    string two = "2";
    DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(8, 1);
    defaultInterpolatedStringHandler.AppendLiteral(" 3");
    defaultInterpolatedStringHandler.AppendFormatted(two);
    defaultInterpolatedStringHandler.AppendLiteral("1 ");
    defaultInterpolatedStringHandler.AppendLiteral(" 4");
    defaultInterpolatedStringHandler.AppendLiteral(" 5");
    string test = defaultInterpolatedStringHandler.ToStringAndClear();
    Console.WriteLine(test);

产生输出 321 4 5

但这是特定于使用 Visual Studio 构建 .NET 6.0 的。使用dotnet build 构建时 代码编译成

    string two = "2";
    string test = "1 " + two + " 3 4 5";
    Console.WriteLine(test);

这会产生正确的输出。

【讨论】:

以上是关于代码在 .Net 5 中有效,但在 .Net 6 中无效的主要内容,如果未能解决你的问题,请参考以下文章

.NET 4 的条件编译 [重复]

如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本

SQL 查询字符串在 SQL Server Management Studio 中有效,但在带有 SQLCommand.ExecuteReader 的 VB.net 中无效

F# System.Runtime.InteropServices 对 SendInput 的本机库调用在 .net 框架中有效,但在 .net 核心中无效

COM 方法调用在 C#、VB.NET 中失败,但在 Python 中有效

DLL 在 MFC 应用程序中有效,但在 .NET 中无效 [重复]