C# · 12月 29, 2021

如何获取当前项目名称在C#代码?

当抛出异常时,我想发送一封电子邮件给自己.使用StackFrame对象,我可以获得抛出异常的文件名,类名和甚至类方法,但是我也需要知道项目名称,因为我的很多ASP.NET项目具有相同的文件名,类名和方法.

这是我的代码:

public static string JndGetEmailTextForDebuggingExceptionError(this Exception Ex) { StackFrame sf = Ex.JndGetStackFrame(); string OutputHTML = “<i><b><u>For Developer Use Only: </u></b></i>” + “<br>” + “<br>” + “Project Name: ” + HttpContext.Current.ApplicationInstance.GetType().Assembly.GetName().Name + “<br>” + //Under discussion “File Name: ” + sf.GetFileName() + “<br>” + “Class Name: ” + sf.getmethod().DeclaringType + “<br>” + “Method Name: ” + sf.getmethod() + “<br>” + “Line Number: ” + sf.GetFileLineNumber() + “<br>” + “Line Column: ” + sf.GetFileColumnNumber() + “<br>” + “Error Message: ” + Ex.Message + “<br>” + “Inner Message : ” + Ex.InnerException.Message + “<br>”; return OutputHTML; }

谢谢所有.

解决方法 您可以使用 Assembly.GetCallingAssembly,如果您的记录代码在单独的库程序集中,并直接从ASP.NET程序集调用到库,并标记方法,使其不会内联: [MethodImpl(MethodImplOptions.NoInlining)]public static string JndGetEmailTextForDebuggingExceptionError(this Exception Ex){ StackFrame sf = Ex.JndGetStackFrame(); string OutputHTML = “<i><b><u>For Developer Use Only: </u></b></i>” + “<br>” + “<br>” + “Project Name: ” + Assembly.GetCallingAssembly().GetName().Name + “<br>” + “File Name: ” + sf.GetFileName() + “<br>” + “Class Name: ” + sf.getmethod().DeclaringType + “<br>” + “Method Name: ” + sf.getmethod() + “<br>” + “Line Number: ” + sf.GetFileLineNumber() + “<br>” + “Line Column: ” + sf.GetFileColumnNumber() + “<br>” + “Error Message: ” + Ex.Message + “<br>” + “Inner Message : ” + Ex.InnerException.Message + “<br>”; return OutputHTML;}

在库中最终想要记录项目名称的任何入口点上,您都必须记录调用程序集并将其标记为NoInline,然后在内部传递.

如果您使用的是.NET 4.5,则可以使用另一种方法:CallerFilePath.它对入口点具有相同的限制,并返回机器上的源路径而不是程序集名称(这可能不太有用),但是更容易知道它会工作(因为它编译它,就像编译可选参数一样),它允许内联:

public static string JndGetEmailTextForDebuggingExceptionError (this Exception Ex,[CallerFilePath] string filePath = “”){ StackFrame sf = Ex.JndGetStackFrame(); string OutputHTML = “<i><b><u>For Developer Use Only: </u></b></i>” + “<br><br>” + “Source File Path: ” + filePath + “<br>” +…