C# 控制台应用程序 ReadLine() 适用于 .NET 4.7.2 而不是 .NET 5(在 dotnetfiddle 上)
Posted
技术标签:
【中文标题】C# 控制台应用程序 ReadLine() 适用于 .NET 4.7.2 而不是 .NET 5(在 dotnetfiddle 上)【英文标题】:C# console application ReadLine() works in .NET 4.7.2 and not in .NET 5 (on dotnetfiddle) 【发布时间】:2021-07-12 05:51:25 【问题描述】:由于我从未编写过控制台应用程序,我认为现在开始是个好主意。如果仅仅是因为我发现 Visual Studio 相当缓慢,并且能够在 dotnetfiddle 等游乐场之一上快速测试代码的想法似乎很有吸引力。 dotnetfiddle.net 上的默认编译器是在 .NET 4.7.2 上,但我注意到那个编译器被我借用的最新代码阻塞了。所以我已经习惯了我必须将编译器切换到 .NET 5 才能利用诸如 $ 之类的细节来格式化文本。
TL;DR
但是,如果您将编译器更改为 .NET 5,我发现一个简单的 ReadLine()
(例如在 https://dotnetfiddle.net/tAJulh 上的示例中找到的)不起作用。在 .NET 5 或这是dotnetfiddle的限制吗?有没有办法解决这个问题?
using System;
public class Program
public static void Main()
// Simply writes the following text to the standard output
Console.WriteLine("Input some text!");
// Reads text until you hit "enter"; and saves it to the "input"-variable
var input = Console.ReadLine();
// Writes the "input"-variable to the console.
Console.WriteLine("Your input was: " + input);
// The program will not exit until you hit "Enter".
Console.ReadLine();
【问题讨论】:
我可以向你保证ReadLine
有效,这似乎是一个 dotnetfiddle 问题。如果你想要一个轻量级的编辑器,看看 Visual Studio Code 甚至 LINQPad。
您可以在此处发布问题:dotnetfiddle.uservoice.com/forums/228764--net-fiddle-ideas 我同意您应该使用其他东西进行测试,例如 LINQPad(但如果没有高级功能,您会错过调试和其他功能)。
感谢@Crowdcoder,我什至没有想到我已经安装了 Visual Studio Code,所以看来我已经准备好创建控制台应用程序了。顺便说一句,我最后总是做在 Visual Studio 中测试我的代码 - 我只使用 dotnetfiddle 对部分代码进行快速测试。
@TimSchmelter 我会的 - 谢谢。
【参考方案1】:
你完全正确。看起来像 dotnetfiddle 上的错误,您应该在此处报告:https://dotnetfiddle.uservoice.com/forums/228764--net-fiddle-ideas
据我所知,在他们纠正错误之前没有办法解决。
正如其他人所说,我强烈建议您获得一个 IDE,这可以是 Visual Studio 代码或普通 Visual Studio
我个人喜欢 VS 代码,因为它很简单,并且非常适合 C# 和 .net
【讨论】:
在这种情况下,VS Code 完全符合我的需要(用于构建控制台应用程序的编辑器和编译器),因此它看起来很合适。但只是澄清一下:据我了解,您不能使用 VS Code 创建 GUI,对吗? @sandokanfirst 如果您需要构建 UI,则必须使用 Visual Studio (visualstudio.microsoft.com/vs/community) 有免费的社区版,我很确定您可以构建 WPF(Windows Presentation Foundation ) 应用程序。如果你只是需要玩它,你可以将它用作拖放,但如果你对设计部分很认真,我建议你更多地了解 xaml 以及设计是如何工作的。【参考方案2】:我可以确认 dotnetfiddle 和我们的 .NET Core 实现目前不支持 Console.ReadLine
。原因是我们使用沙箱,因为我们在执行用户代码时需要安全。对于 .NET 5,我们使用 docker,而对于常规 .NET 4.7.2\Roslyn,我们使用 AppDomains。在 docker 案例中,我们只是编译代码并按原样执行它。在 AppDomain 案例中,我们通过在用户代码之上注入自己的代码来限制它。
由于这些方式不同,它们中的每一种都可能比其他方式有一些限制。 ReadLine 的问题在于,当用户运行自己的代码时,我们需要部分执行它,然后注入到Console.In
流中,如果从流中请求某些内容,则我们停止执行并要求用户提供输入,然后在输入之后提供后,我们需要再次重新开始执行并使用该用户在Console.In
中的输入并一遍又一遍地重复,直到代码完全执行。为 AppDomain 注入它要容易得多,因此它在 .NET 4.7.2 中可以正常工作,但在 docker 中更难做到,因为我们不在那里注入自己的代码,因此目前缺少此功能。
【讨论】:
我是 .NET 和 C# 的初学者,无法理解您解释的所有细节 - 特别是关于 AppDomain 的部分 - 但我明白了它的要点,很高兴知道这一点确实是一个限制。 我有类似的情况,我所做的是使用中间的python
脚本来使用p = subprocess.Popen
启动构建的二进制文件,然后我使用p.communicate
转发“键入的输入”(实际上在python
脚本中捕获的字符串变量)到stdin
。以上是关于C# 控制台应用程序 ReadLine() 适用于 .NET 4.7.2 而不是 .NET 5(在 dotnetfiddle 上)的主要内容,如果未能解决你的问题,请参考以下文章