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

J -*_*per 18 c# asp.net exception

我想在发生异常时向自己发送电子邮件.使用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;
    }
Run Code Online (Sandbox Code Playgroud)

谢谢大家.

Tim*_* S. 17

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;
}
Run Code Online (Sandbox Code Playgroud)

在库中可能最终想要记录项目名称的任何入口点,您必须记录调用程序集并标记它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>" +
...
Run Code Online (Sandbox Code Playgroud)


小智 13

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

System.Reflection.Assembly.GetEntryAssembly().GetName().Name
Run Code Online (Sandbox Code Playgroud)


.NET Core API参考


SLa*_*aks 5

您可以使用

HttpContext.Current.ApplicationInstance.GetType().Assembly.GetName().Name
Run Code Online (Sandbox Code Playgroud)

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

HttpContext.Current.ApplicationInstance.GetType().BaseType.Assembly.GetName().Name
Run Code Online (Sandbox Code Playgroud)

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

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

您还可以使用HttpRuntime.AppDomainAppPath将磁盘上的物理路径获取到已部署的站点; 这将无处不在.


Ram*_*ran 5

反思是查找产品名称,公司名称版本信息的最佳方式.

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

另一种方式就是获取直接项目名称

string projectName=System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString();
Run Code Online (Sandbox Code Playgroud)

  • 如果它在一个单独的程序集中,这将不起作用(这很可能) (2认同)

DGi*_*bbs 5

这应该足够了

string projectName = Assembly.GetCallingAssembly().GetName().Name;
Run Code Online (Sandbox Code Playgroud)

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