Bagikan melalui


Assembly.GetCallingAssembly Metode

Definisi

Mengembalikan Assembly metode yang memanggil metode yang saat ini dijalankan.

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

Mengembalikan

Objek Assembly metode yang memanggil metode yang saat ini dijalankan.

Contoh

Contoh berikut mendapatkan rakitan panggilan dari metode saat ini.

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

Keterangan

Jika metode yang memanggil GetCallingAssembly metode diperluas sebaris oleh pengkompilasi just-in-time (JIT), atau jika pemanggilnya diperluas sebaris, perakitan yang dikembalikan GetCallingAssembly mungkin berbeda secara tak terduga. Misalnya, pertimbangkan metode dan rakitan berikut:

  • Metode M1 dalam assembly A1 memanggil GetCallingAssembly.

  • Metode M2 dalam assembly A2 memanggil M1.

  • Metode M3 dalam assembly A3 memanggil M2.

Ketika M1 tidak sebaris, GetCallingAssembly mengembalikan A2. Ketika M1 inlined, GetCallingAssembly mengembalikan A3. Demikian pula, ketika M2 tidak sebaris, GetCallingAssembly mengembalikan A2. Ketika M2 inlined, GetCallingAssembly mengembalikan A3.

Efek ini juga terjadi ketika M1 dijalankan sebagai panggilan ekor dari M2, atau ketika M2 dijalankan sebagai panggilan ekor dari M3. Anda dapat mencegah pengkompilasi JIT menginlining metode yang memanggil GetCallingAssembly, dengan menerapkan MethodImplAttribute atribut dengan MethodImplOptions.NoInlining bendera , tetapi tidak ada mekanisme serupa untuk mencegah panggilan ekor.

Berlaku untuk