【发布时间】:2020-10-27 20:09:22
【问题描述】:
我在 .net 标准 2.0 中编写了一个 dll。假设只是通过StreamWriter将数据写入文本文件。
注意:我知道下面的代码可以用更好的方式编写。此代码只是测试库。
DLL 代码:
public class WriteIntoLog
{
private StreamWriter _streamWriter;
public void WriteMsgToFile(string message)
{
try
{
bool close = true;
if (_streamWriter == null || _streamWriter.BaseStream == null)
_streamWriter = new StreamWriter("Test.txt", true);
_streamWriter.WriteLine(message);
if (close)
CloseLogFileStream(false);
}
catch (IOException ioEx)
{
throw new Exception(ioEx.Message);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public void CloseLogFileStream(bool dispose)
{
if (_streamWriter != null)
{
_streamWriter.Close();
if (dispose)
_streamWriter = null;
}
}
}
并从.net core 2.1编写的控制台应用程序调用此dll
class TStreamWriter
{
static void Main(string[] args)
{
WriteIntoLog log = new WriteIntoLog();
for (int i = 0; i < 10; i++)
{
log.WriteMsgToFile($"Loop no: {i.ToString()}");
}
Console.WriteLine("Hello World!");
}
}
现在此代码按预期运行,但是当我将控制台应用程序的目标平台更改为 .net core 3.0 时,代码返回“无法写入已关闭的 TextWriter”的异常。
那么为什么它在.net core 2.1 中运行控制台应用程序时不返回异常。
【问题讨论】:
-
没有区别。
WriteIntoLog虽然有问题,但无论它是否存在,都会使用相同的 cached 流。鉴于WriteMsgToFile之外不需要此流,因此没有理由将其存储在字段中 -
为什么要编写自己的日志记录代码,而不是使用像 Serilog 或 .NET Core 自己的 Microsoft.Extensions.Logging 这样的库?
-
顺便说一句,你可以用
File.AppendAllText(somePath,message + "\n");替换所有这些代码 -
@PanagiotisKanavos 存在一些差异,因为相同的代码在 2.1 中运行良好,而在 3.0 中出现异常。
-
并非如此 - 实例已被处置,已死亡,不打算再次使用。事实上,我很惊讶当您尝试访问
BaseStream时却没有收到ObjectDisposedException。
标签: c# .net-core .net-standard .net-core-3.0 .net-core-2.1