30

例外がスローされたときに自分にメールを送信したい。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;
    }

皆さんありがとう。

4

5 に答える 5

36

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>" +
...
于 2013-08-19T15:07:09.240 に答える
32

ASP.NET Core と互換性のあるソリューションを探している人にとっては、次のように動作するはずです。

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


.NET コア API リファレンス

于 2016-09-27T07:16:00.413 に答える
11

これで十分なはずです

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

編集* 別のアセンブリからこれを実行している場合は、代わりにGetCallingAssemblyを使用する必要があります。

于 2013-08-19T14:48:46.270 に答える
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();
于 2013-08-19T14:48:08.377 に答える
5

使用できます

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

これが を返す場合は、次App_global.asax....のように変更します

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

HTTP リクエストで実行していない場合は、何らかの方法でHttpContext.

(Web アプリケーションではなく) Web サイト プロジェクトにいる場合、これは異なる結果を返します。

HttpRuntime.AppDomainAppPathを使用して、デプロイされたサイトへのディスク上の物理パスを取得することもできます。これはどこでも機能します。

于 2013-08-19T14:47:14.953 に答える