【问题标题】:How to get the current project name in C# code?如何在 C# 代码中获取当前项目名称?
【发布时间】:2013-08-21 10:04:51
【问题描述】:

我想在抛出异常时给自己发送一封电子邮件。使用 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;
    }

谢谢大家。

【问题讨论】:

  • 这听起来令人困惑。为什么不同项目的文件名和类名一样?
  • @TimS。 - 文件:HomeController.cs;类:家庭控制器;方法:索引。这是大多数 VS 用户在新的 MVC 项目中获得的模板。
  • 不确定您所说的项目是什么意思,调用程序集?除非您使用 throw(ex) 将其销毁,否则应该在堆栈跟踪中。某种应用程序记录器并附加输出将是更好的选择。当事情变得可怕时,您可以将它们排队而不是收到大量电子邮件。
  • 它在单独的程序集中。
  • 我认为我可以使用完整的文件路径来确定它是哪个项目,但是我想知道是否有更好的方法来仅获取项目名称。

标签: c# asp.net exception


【解决方案1】:

对于任何寻找与 ASP.NET Core 兼容的解决方案的人,以下应该可以工作;

System.Reflection.Assembly.GetEntryAssembly().GetName().Name


.NET Core API Reference

【讨论】:

    【解决方案2】:

    如果您将日志记录代码放在单独的库程序集中,则可以使用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;
    }
    

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

    如果您使用的是 .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>" +
    ...
    

    【讨论】:

    • 取决于他如何调用代码,这不太可能奏效。如果他在错误处理程序中运行,则调用程序集将是 System.Web 或他的日志程序集。
    • @SLaks 在他的错误处理代码库的任何public 入口点,他应该记录Assembly.GetCallingAssembly()(然后根据需要在内部传递)。那不行吗?
    • @J-CSharper,你得到了什么程序集名称?什么程序集包含调用JndGetEmailTextForDebuggingExceptionError的方法?
    • 保持一分钟。让我重试。
    • 它有效。谢谢蒂姆,对不起,我第一次没有正确测试它。谢谢大家的支持。你是我接触过的最好的代码支持论坛。
    【解决方案3】:

    应该够了

    string projectName = Assembly.GetCallingAssembly().GetName().Name;
    

    编辑* 如果您是从另一个程序集运行它,那么您应该改用 GetCallingAssembly

    【讨论】:

    • 这还不够好;他的日志记录代码可能(希望)在一个单独的库程序集中。
    【解决方案4】:

    你可以使用

    HttpContext.Current.ApplicationInstance.GetType().Assembly.GetName().Name
    

    如果返回App_global.asax....,则将其更改为

    HttpContext.Current.ApplicationInstance.GetType().BaseType.Assembly.GetName().Name
    

    如果您没有在 HTTP 请求中运行,则需要一些方法来获取HttpContext

    如果您在网站项目中(而不是 Web 应用程序),这将返回不同的结果。

    您还可以使用HttpRuntime.AppDomainAppPath 获取磁盘上到已部署站点的物理路径;这将适用于任何地方。

    【讨论】:

    • 这给了我System.Web 在名为WebApplication1..的项目下运行时?
    • @dtsg:该项目是否在 Global.asax 中注册了 HttpApplication 后代?
    • 这是一个没有Global.asax文件的新项目
    • @dtsg:这就解释了。 AFAIK,所有真正的项目都会有一个 Global.asax。
    • 对。从另一个程序集(您的第二个示例)调用它并返回 App_global.asax.xw877d4c?
    【解决方案5】:

    反思是找出产品名称、公司名称版本等信息的最佳方式。

    public static string ProductName
    {
     get
     {
        AssemblyProductAttribute myProduct =(AssemblyProductAttribute)AssemblyProductAttribute.GetCustomAttribute(Assembly.GetExecutingAssembly(),
         typeof(AssemblyProductAttribute));
          return myProduct.Product;
      }
    }
    

    还有另一种方式,比如直接获取项目名称

    string projectName=System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString();
    

    【讨论】:

    • 如果它在单独的程序集中(这很可能)将不起作用
    • 另外,ASP.Net 项目不太可能有这个属性。
    • 如果单个程序集在 ASP.NET 中工作正常
    猜你喜欢
    • 2015-09-08
    • 2018-02-10
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2017-09-05
    • 2010-11-18
    相关资源
    最近更新 更多