22

デバッグデータファイルが利用可能(PDB)であり、System.ReflectionまたはMono.Cecilなどの別の同様のフレームワークを使用することを考慮して、タイプまたはタイプのメンバーが存在するソースファイル名と行番号をプログラムで取得する方法宣言しました。

たとえば、このファイルをアセンブリにコンパイルしたとします。

C:\ MyProject \ Foo.cs

1:    public class Foo
2:    {
3:       public string SayHello()
4:       {
5:           return "Hello";
6:       }
7:    }

次のようなことを行う方法:

MethodInfo methodInfo = typeof(Foo).GetMethod("SayHello");
string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist!
int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist!

sourceFileNameには「C:\ MyProject \ Foo.cs」が含まれ、sourceLineNumberは3に等しくなります。

更新:System.Diagnostics.StackFrame確かにその情報を取得できますが、現在実行中の呼び出しスタックの範囲内でのみです。これは、メソッドを最初に呼び出す必要があることを意味します。同じ情報を取得したいのですが、タイプメンバーを呼び出さないでください。

4

3 に答える 3

-1

あなたはこれらのリンクでいくつかの助けを見つけるかもしれません:

PDBファイルをデプロイせずにファイル番号と行番号を取得することも、次の投稿 で見つかりました

"ハイマーク、

以下に、(ソースファイル内の)コードの行番号を示します。

Dim CurrentStack As System.Diagnostics.StackTrace
MsgBox (CurrentStack.GetFrame(0).GetFileLineNumber)

興味がある場合は、現在のルーチンとそのすべての呼び出し元について調べることができます。

Public Function MeAndMyCaller As String
    Dim CurrentStack As New System.Diagnostics.StackTrace
    Dim Myself As String = CurrentStack.GetFrame(0).GetMethod.Name
    Dim MyCaller As String = CurrentStack.GetFrame(1).GetMethod.Name
    Return "In " & Myself & vbCrLf & "Called by " & MyCaller
End Function

これは、呼び出し元の名前(エラーが発生した場所)を取得できるため、一般化されたエラールーチンが必要な場合に非常に便利です。

よろしくお願いいたします。FergusMVP[Windowsのスタートボタン、シャットダウンダイアログ] "

于 2008-09-24T09:06:08.493 に答える