You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET转C#:代码转换及My.Application.Log.WriteException等效实现问询

VB.NET转C#:解决My.Application.Log.WriteException的等效实现问题

我来帮你搞定这个日志转换的难题!你已经完成了大部分代码转换,卡在My.Application.Log.WriteException这一步很正常——VB.NET的My命名空间是封装过的语法糖,C#里没有直接对应的同名API,哪怕加了Microsoft.VisualBasic引用也没法直接照搬。

当前转换状态梳理

  • 正在将旧VB.NET代码迁移至C#,已将编译错误从100+降至10个左右
  • 文件复制/移动的核心逻辑已完成转换,但catch块中的日志代码始终找不到合适的C#替代写法

已转换代码对比

VB.NET原try-catch代码

Try
    My.Computer.FileSystem.CopyFile(strFile, strExportPath + "\" + strFileName(0), FileIO.UIOption.OnlyErrorDialogs, FileIO.UICancelOption.DoNothing)
    intFilesCopied += 1
    My.Computer.FileSystem.MoveFile(strFile, _strPath + "Data\Backup\" + strFileName(0), FileIO.UIOption.OnlyErrorDialogs, FileIO.UICancelOption.DoNothing)
    intFilesMoved += 1
Catch ex As Exception
    My.Application.Log.WriteException(ex, TraceEventType.Error, "ExportDataToolStripMenuItem_Click")
End Try

你尝试的C#代码

try
{
    File.Copy(strFile, strExportPath + @"\" + strFileName[0], UIOption.OnlyErrorDialogs, FileIO.UICancelOption.DoNothing);
    intFilesCopied += 1;
    File.Move(strFile, _strPath + @"Data\Backup\" + strFileName[0], UIOption.OnlyErrorDialogs, UICancelOption.DoNothing);
    intFilesMoved += 1;
}
catch (Exception ex)
{
    Application.Log.WriteException(ex, TraceEventType.Error, "ExportDataToolStripMenuItem_Click");
}

核心问题解析:My.Application.Log的本质

My.Application.Log.WriteException本质是封装了.NET原生System.Diagnostics命名空间的日志功能,默认会将日志输出到Windows事件日志或应用配置的跟踪监听器。C#无需依赖Microsoft.VisualBasic,直接用原生API就能实现完全一致的效果。

两种可行的C#替代方案

方案1:使用System.Diagnostics.Trace(最贴近VB.NET原行为)

该方案和VB.NET的My.Application.Log逻辑几乎一致,会使用项目配置的跟踪监听器输出日志:

using System.Diagnostics;

// 在catch块中替换为以下代码
var errorMessage = $"Could not write record to data file {_strActiveFileName}{Environment.NewLine}Record Data: {strRecordText}";
// 记录错误消息与异常堆栈
Trace.TraceError($"{errorMessage}{Environment.NewLine}{ex.ToString()}");

// 如需精准匹配原WriteException的参数逻辑,可手动遍历TraceListener
foreach (TraceListener listener in Trace.Listeners)
{
    listener.TraceEvent(
        new TraceEventCache(),
        "YourAppName", // 替换为你的应用名称
        TraceEventType.Error,
        0, // 自定义事件ID
        errorMessage,
        ex
    );
    listener.Flush();
}

方案2:直接写入Windows事件日志

如果你的VB.NET代码默认将日志写入Windows事件日志,C#可直接用EventLog类实现:

using System.Diagnostics;

// 在catch块中
string fullMessage = $"Could not write record to data file {_strActiveFileName}{Environment.NewLine}Record Data: {strRecordText}{Environment.NewLine}Exception Details: {ex.ToString()}";
EventLog.WriteEntry(
    "Application", // 目标事件日志名称,默认是Application
    fullMessage,
    EventLogEntryType.Error // 日志级别,对应原TraceEventType.Error
);

为什么添加Microsoft.VisualBasic无效?

VB.NET的My.Application.Log是Microsoft.VisualBasic.ApplicationServices.ApplicationBase类的属性,C#项目默认不会继承该类,因此即使添加引用也无法直接调用Application.Log。与其绕这个弯路,直接使用原生.NET日志API更符合C#编码习惯。

内容的提问来源于stack exchange,提问作者davlovsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:26:34