Ответ 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>" +
...