Поделиться через


Assembly.GetCallingAssembly Метод

Определение

Возвращает объект Assembly метода, вызвавшего текущий выполняемый метод.

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 метода, вызвавшего выполняющийся в текущий момент метод.

Примеры

В следующем примере возвращается вызывающая сборка текущего метода.

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

Комментарии

Если метод, вызывающий GetCallingAssembly метод, развернут встроенным JIT-компилятором или его вызывающий объект развернут встроенным, сборка, возвращаемая методом GetCallingAssembly , может неожиданно отличаться. Например, рассмотрим следующие методы и сборки:

  • Метод M1 в сборке A1 вызывает GetCallingAssembly.

  • Метод M2 в сборке A2 вызывает M1.

  • Метод M3 в сборке A3 вызывает M2.

Если M1 не является встраивным, GetCallingAssembly возвращает .A2 При M1 встраивном значении GetCallingAssembly возвращает .A3 Аналогичным образом, если M2 не является встраивным, GetCallingAssembly возвращает .A2 При M2 встраивном значении GetCallingAssembly возвращает .A3

Этот эффект также возникает при M1 выполнении в качестве вызова хвоста из M2или при M2 выполнении в качестве вызова tail из M3. Вы можете запретить JIT-компилятору встраивание метода, который вызывает GetCallingAssembly, путем применения MethodImplAttribute атрибута с флагом MethodImplOptions.NoInlining , но нет аналогичного механизма для предотвращения вызовов tail.

Применяется к