ヘッダー
Visual Basic サンプル集
VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

呼び出し元のメソッド名などの情報を取得する

2020/11/8

→ C# のサンプルに切り替える

 

 

呼び出し元のメソッド名を取得する

これでもできます。

この例を実行するにはファイルの先頭の方に Imports System.Runtime.CompilerServices の記述が必要です。

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Test()
End Sub

Public Sub Test(<CallerMemberName> Optional callerMethodName As String = "")
    Debug.WriteLine(callerMethodName & " から呼び出されました。")
End Sub

実行すると「InvokeTest から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

参考:呼び出し元情報

  • コンストラクター(Sub New)やプロパティ(Property)が呼び出し元の場合、通常フレームワークによって隠蔽されている名前を取得します。下記の表の通りです。たとえば、コンストラクターが呼び出し元の場合、「.ctor」という名前を取得します。プロパティのGetが呼び出し元の場合ではget_プロパティ名を取得します。
種類 取得する名前
メソッド(Function, Sub) メソッド名。
プロパティ(Property) get_プロパティ名 または set_プロパティ名。例:get_Enabled
コンストラクター(Sub New) .ctor
静的コンストラクター(Shared Sub New) .cctor
演算子(Operator) op_演算子名。例:op_Addition

 

次の例のように、任意の引数を追加しても機能します。

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Add(2, 3)
End Sub

Public Function Add(x As Integer, y As Integer, <CallerMemberName> Optional callerMethodName As String = "") As Integer
    Debug.WriteLine(callerMethodName & " から呼び出されました。")
    Return x + y
End Function

実行すると「InvokeTest から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

 

これでもできます。

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Test()
End Sub

Public Sub Test()
    Dim caller As New StackFrame(1, False)
    Dim callerMethodName As String = caller.GetMethod.Name

    Debug.WriteLine(callerMethodName & " から呼び出されました。")
End Sub

実行すると「InvokeTest から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

  • StackFrameクラスのコンストラクターの第1引数を、2、3、4、・・・とすると、呼び出し元の呼び出し元、その呼び出し元・・・というように情報をさかのぼれます。
  • 直接の呼び出し元の情報を取得するだけなら最初の例の方が優れています。
  • コンストラクター(Sub New)やプロパティ(Property)が呼び出し元の場合、通常フレームワークによって隠蔽されている名前を取得します。上掲の表を参照してください。

 

 

呼び出し元のクラス名を取得する

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Test()
End Sub

Public Sub Test()
    Dim caller As New StackFrame(1, False)
    Dim callerClassName As String = caller.GetMethod.DeclaringType.FullName

    Debug.WriteLine(callerClassName & " クラスから呼び出されました。")
End Sub

実行すると、たとえば「VBCoreTest.TestClass クラスから呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

  • StackFrameクラスのコンストラクターの第1引数を、2、3、4、・・・とすると、呼び出し元の呼び出し元、その呼び出し元・・・というように情報をさかのぼれます。

 

 

呼び出し元のファイル名を取得する

この例を実行するにはファイルの先頭の方に Imports System.Runtime.CompilerServices の記述が必要です。

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Test
End Sub

Public Sub Test(<CallerFilePath> Optional callerFilePath As String = "")
    Debug.WriteLine(callerFilePath & " ファイルから呼び出されました。")
End Sub

実行すると、たとえば「C:\Users\rucio\Source\Repos\ConsoleApp1\TestClass.vb ファイルから呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

  • ファイル名は、コンパイル時点でアセンブリ(exeファイルやdllファイル)内に文字列として埋め込まれます。そのため、開発者のパソコンとは異なるパソコンで実行しても、コンパイル時点で開発者のパソコンに存在していたソースコードのファイル名を取得します。ユーザー名など機密情報を含むパスを埋め込まないように注意してください。

 

 

呼び出し元の行番号を取得する

次の例では、InvokeTest 内で Me.Test と記述されている行の行番号をを出力します。

この例を実行するにはファイルの先頭の方に Imports System.Runtime.CompilerServices の記述が必要です。

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Test
End Sub

Public Sub Test(<CallerLineNumber> Optional callerLineNumber As Integer = 0)
    Debug.WriteLine(callerLineNumber &  " 行目から呼び出されました。")
End Sub

実行すると、たとえば「7 行目から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

 

これでもできます。

VB.NET2002対応 VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Test()
End Sub

Public Sub Test()
    Dim caller As New StackFrame(1, True)
    Dim callerLineNumber As Integer = caller.GetFileLineNumber

    Debug.WriteLine(callerLineNumber & " 行目から呼び出されました。")
End Sub

実行すると、たとえば「7 行目から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

  • StackFrameクラスのコンストラクターの第1引数を、2、3、4、・・・とすると、呼び出し元の呼び出し元、その呼び出し元・・・というように情報をさかのぼれます。
  • VB2012以上の場合、CallerLineNumber属性を使用する上の例の方が優れています。この例を採用する理由はありません。
  • デバッグビルド時のみ行数を取得できます。リリースビルドの場合行数は常に 0 になります。

 

 

呼び出し元のファイル名と行番号を偽装する

次の例では、呼び出し元を偽装し、実際とは異なるファイル名と行番号を指定して出力します。

この例を実行するにはファイルの先頭の方に Imports System.Runtime.CompilerServices の記述が必要です。

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
#ExternalSource ("C:\xxx\dummy.vb", 123)
    Me.Test
#End ExternalSource
End Sub

Public Sub Test(<CallerFilePath> Optional callerFilePath As String = "", <CallerLineNumber> Optional callerLineNumber As Integer = 0)
    Debug.WriteLine($"{callerFilePath}ファイルの{callerLineNumber}行目から呼び出されました。")
End Sub

実行すると、「C:\xxx\dummy.vbファイルの123行目から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所

  • 偽装できるのはファイル名と行番号だけです。クラス名とメソッド名は偽装できません。
  • このような偽装は、フレームワークなどが自動生成するソースコードの中で、自動生成の基になった設定やソースコードを追跡可能にするのが主要な目的です。

 

 

参考:呼び出し元のファイル名とメソッド名と行番号を取得する

この例を実行するにはファイルの先頭の方に Imports System.Runtime.CompilerServices の記述が必要です。

VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

Public Sub InvokeTest()
    Me.Test
End Sub

Public Sub Test(<CallerMemberName> Optional callerMethodName As String = "",
                <CallerFilePath> Optional callerFilePath As String = "",
                <CallerLineNumber> Optional callerLineNumber As Integer = -1)

    Debug.WriteLine($"{callerFilePath}ファイルの{callerMethodName}{callerLineNumber}行目から呼び出されました。")

End Sub

実行すると、たとえば「C:\Users\rucio\Source\Repos\ConsoleApp1\TestClass.vbファイルのInvokeTestの7行目から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所


VB6対応 VB6には同じ機能は用意されていません。