Как получить имя текущего проекта в коде С#?

Я хочу отправить электронное письмо себе, когда вызывается исключение. Используя объект 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;
    }

Спасибо всем.

Ответ 1

Вы можете использовать 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>" +
...

Ответ 2

Для тех, кто ищет решение, совместимое с ASP.NET Core, должно работать следующее:

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


. Ссылка NET Core API

Ответ 3

Вы можете использовать

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

Если это возвращает App_global.asax...., измените его на

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

Если вы не используете HTTP-запрос, вам потребуется какой-то способ получить HttpContext.

Это приведет к возврату различных результатов, если вы находитесь в проекте веб-сайта (в отличие от веб-приложения).

Вы также можете использовать HttpRuntime.AppDomainAppPath, чтобы получить физический путь на диске к развернутому сайту; это будет работать везде.

Ответ 4

Отражение - лучший способ узнать название продукта, название компании, например, информацию.

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();

Ответ 5

Этого должно быть достаточно

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

Изменить * Если вы используете это из другой сборки, вы должны использовать GetCallingAssembly.