Visual Basic サンプル集 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
呼び出し元のメソッド名などの情報を取得する
2020/11/8
目次
呼び出し元のメソッド名を取得する
これでもできます。
この例を実行するにはファイルの先頭の方に Imports System.Runtime.CompilerServices の記述が必要です。
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 |
次の例のように、任意の引数を追加しても機能します。
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が表示される場所
これでもできます。
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)が呼び出し元の場合、通常フレームワークによって隠蔽されている名前を取得します。上掲の表を参照してください。
呼び出し元のクラス名を取得する
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 の記述が必要です。
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 の記述が必要です。
Public Sub
InvokeTest() Me.Test End Sub Public Sub Test(<CallerLineNumber> Optional callerLineNumber As Integer = 0) Debug.WriteLine(callerLineNumber & " 行目から呼び出されました。") End Sub |
実行すると、たとえば「7 行目から呼び出されました。」と表示されます。→ Debug.WriteLineが表示される場所
これでもできます。
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 の記述が必要です。
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 の記述が必要です。
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には同じ機能は用意されていません。