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
相关产品推荐
相关产品推荐

