Assembly.GetCallingAssembly Methode

Definition

Gibt die Assembly der Methode zurück, die die derzeit ausgeführte Methode aufgerufen hat.

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

Gibt zurück

Das Assembly-Objekt der Methode, die die derzeit ausgeführte Methode aufgerufen hat.

Beispiele

Im folgenden Beispiel wird die aufrufende Assembly der aktuellen Methode abgerufen.

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()
        {
            FirstMethod();
            SecondAssembly.InSecondAssembly.OtherMethod();
        }

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

// Assembly SecondAssembly
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

Hinweise

Wenn die Methode, die die GetCallingAssembly -Methode aufruft, vom JIT-Compiler (Just-in-Time) inline erweitert wird oder ihr Aufrufer inline erweitert wird, kann sich die zurückgegebene GetCallingAssembly Assembly unerwartet unterscheiden. Betrachten Sie beispielsweise die folgenden Methoden und Assemblys:

  • Methode M1 in Assemblyaufrufen A1GetCallingAssembly.

  • Methode M2 in Assemblyaufrufen A2M1.

  • Methode M3 in Assemblyaufrufen A3M2.

Wenn M1 nicht inlined ist, GetCallingAssembly wird zurückgegeben A2. Wenn M1 inlined ist, GetCallingAssembly wird zurückgegeben A3. Auf ähnliche Weise wird zurückgegebenA2, GetCallingAssembly wenn M2 nicht inlined ist. Wenn M2 inlined ist, GetCallingAssembly wird zurückgegeben A3.

Dieser Effekt tritt auch auf, wenn M1 als Tail-Aufruf von M2ausgeführt wird oder wenn M2 als Tail-Aufruf von ausgeführt wird M3. Sie können verhindern, dass der JIT-Compiler die Methode aufgibt, die aufruft GetCallingAssembly, indem Sie das MethodImplAttribute Attribut mit dem MethodImplOptions.NoInlining Flag anwenden. Es gibt jedoch keinen ähnlichen Mechanismus zum Verhindern von Tailaufrufen.

Gilt für: