加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:46:06 所属栏目:百科 来源:网络整理
导读:当抛出异常时,我想发送一封电子邮件给自己.使用StackFrame对象,我可以获得抛出异常的文件名,类名和甚至类方法,但是我也需要知道项目名称,因为我的很多ASP.NET项目具有相同的文件名,类名和方法. 这是我的代码: public static string JndGetEmailTextForDebug
当抛出异常时,我想发送一封电子邮件给自己.使用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>" +
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读