Assembly.GetCallingAssembly メソッド

定義

現在実行中のメソッドを呼び出したメソッドの Assembly を返します。Returns the Assembly of the method that invoked the currently executing method.

public:
 static System::Reflection::Assembly ^ GetCallingAssembly();
public static System.Reflection.Assembly GetCallingAssembly ();
static member GetCallingAssembly : unit -> System.Reflection.Assembly
Public Shared Function GetCallingAssembly () As Assembly

戻り値

Assembly

現在実行中のメソッドを呼び出したメソッドの Assembly オブジェクト。The Assembly object of the method that invoked the currently executing method.

次の例では、現在のメソッドの呼び出し元のアセンブリを取得します。The following example gets the calling assembly of the current method.

using namespace System;
using namespace System::Reflection;

void main()
{
   // Instantiate a target object.
   Int32 integer1 = 0;
   // Set the Type instance to the target class type.
   Type^ type1 = integer1.GetType();
   // Instantiate an Assembly class to the assembly housing the Integer type.
   Assembly^ sampleAssembly = Assembly::GetAssembly(integer1.GetType());
   // Display the name of the assembly that is calling the method.
   Console::WriteLine("GetCallingAssembly = {0}", Assembly::GetCallingAssembly()->FullName);
}
// The example displays output like the following:
//    GetCallingAssembly = Example, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// Assembly FirstAssembly
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace FirstAssembly
{
    public class InFirstAssembly
    {
        public static void Main()
        {
            FistMethod();
            SecondAssembly.InSecondAssembly.OtherMethod();
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void FirstMethod()
        {
            Console.WriteLine("FirstMethod called from: " + Assembly.GetCallingAssembly().FullName);
        }
    }
}

// Assembly SecondAssembly
using System;
using System.Reflection;
using System.Runtime.CompilerServices;

namespace SecondAssembly
{
    class InSecondAssembly
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void OtherMethod()
        {
            Console.WriteLine("OtherMethod executing assembly: " + Assembly.GetExecutingAssembly().FullName);
            Console.WriteLine("OtherMethod called from: " + Assembly.GetCallingAssembly().FullName);
        }
    }
}
// The example produces output like the following:
// "FirstMethod called from: FirstAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
// "OtherMethod executing assembly: SecondAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
// "OtherMethod called from: FirstAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
Imports System.Reflection

Module Example
   Public Sub Main()
      ' Instantiate a target object.
      Dim int1 As Integer
      ' Set the Type instance to the target class type.
      Dim type1 As Type =int1.GetType()
      ' Instantiate an Assembly class to the assembly housing the Integer type.
      Dim sampleAssembly = Assembly.GetAssembly(int1.GetType())
      ' Display the name of the assembly that is calling the method.
      Console.WriteLine(("GetCallingAssembly = " + Assembly.GetCallingAssembly().FullName))
   End Sub
End Module
' The example displays output like the following:
'   GetCallingAssembly = Example, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

注釈

メソッドを呼び出すメソッド GetCallingAssembly が just-in-time (JIT) コンパイラによってインラインで展開されている場合、または呼び出し元がインラインで展開されている場合は、によって返されるアセンブリ GetCallingAssembly が予期せず異なることがあります。If the method that calls the GetCallingAssembly method is expanded inline by the just-in-time (JIT) compiler, or if its caller is expanded inline, the assembly that is returned by GetCallingAssembly may differ unexpectedly. たとえば、次のメソッドとアセンブリについて考えてみます。For example, consider the following methods and assemblies:

  • M1アセンブリ呼び出しの A1 メソッド GetCallingAssemblyMethod M1 in assembly A1 calls GetCallingAssembly.

  • M2アセンブリ呼び出しの A2 メソッド M1Method M2 in assembly A2 calls M1.

  • M3アセンブリ呼び出しの A3 メソッド M2Method M3 in assembly A3 calls M2.

M1がインラインでない場合、は GetCallingAssembly を返し A2 ます。When M1 is not inlined, GetCallingAssembly returns A2. がインライン化されている場合 M1 、は GetCallingAssembly を返し A3 ます。When M1 is inlined, GetCallingAssembly returns A3. 同様に、 M2 がインライン化されていない場合、はを GetCallingAssembly 返し A2 ます。Similarly, when M2 is not inlined, GetCallingAssembly returns A2. がインライン化されている場合 M2 、は GetCallingAssembly を返し A3 ます。When M2 is inlined, GetCallingAssembly returns A3.

この効果 M1 は、がからの末尾呼び出しとして実行される場合 M2 、または M2 からの末尾呼び出しとして実行される場合にも発生し M3 ます。This effect also occurs when M1 executes as a tail call from M2, or when M2 executes as a tail call from M3. フラグを使用して属性を適用することで、を呼び出すメソッドが JIT コンパイラによってインライン展開されないようにすることができ GetCallingAssembly MethodImplAttribute MethodImplOptions.NoInlining ますが、tail 呼び出しを防止するための同様の機構はありません。You can prevent the JIT compiler from inlining the method that calls GetCallingAssembly, by applying the MethodImplAttribute attribute with the MethodImplOptions.NoInlining flag, but there is no similar mechanism for preventing tail calls.

適用対象