例外がスローされたときに自分にメールを送信したい。 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;
}
ライブラリのエントリポイントでプロジェクト名をログに記録したい場合は、呼び出し元のアセンブリを記録して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>" +
...
ASP.NET Core互換ソリューションをお探しの方は、次のようにしてください。
System.Reflection.Assembly.GetEntryAssembly().GetName().Name
使用できます
HttpContext.Current.ApplicationInstance.GetType().Assembly.GetName().Name
これがApp_global.asax....
を返す場合は、次のように変更します
HttpContext.Current.ApplicationInstance.GetType().BaseType.Assembly.GetName().Name
HTTPリクエストで実行していない場合は、HttpContext
を取得する方法が必要です。
(Webアプリケーションではなく)Webサイトプロジェクトにいる場合、これは異なる結果を返します。
HttpRuntime.AppDomainAppPath
を使用して、デプロイされたサイトへのディスク上の物理パスを取得することもできます。これはどこでも機能します。
リフレクションは、製品名、会社名のバージョンなどの情報を見つけるための最良の方法です。
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();
これで十分です
string projectName = Assembly.GetCallingAssembly().GetName().Name;
編集*別のアセンブリからこれを実行している場合は、代わりに GetCallingAssembly を使用する必要があります。