Отражение для выполнения кода в Assembly.GetExecutingAssembly возвращает null - PullRequest
0 голосов
/ 13 мая 2018

Согласно .Net Framework Исходный код , GetExecutingAssembly использует следующий код для получения сборки.

public static Assembly GetExecutingAssembly()
{
    StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
    return RuntimeAssembly.GetExecutingAssembly(ref stackMark);
}

Используйте System.Reflection для вызова этого метода.

Type.GetType("System.Reflection.Assembly")
    .GetMethods(BindingFlags.Public | BindingFlags.Static)
    .Where(f => f.Name.Contains("GetCallingAssembly"))
    .First().Invoke(null, null)

Однако, если я использую рефлексию для вызова кода внутри Assembly.GetExecutingAssembly, он всегда возвращает ноль.

Type.GetType("System.Reflection.RuntimeAssembly")
    .GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
    .Where(f => f.Name.Contains("GetExecutingAssembly")).Skip(1)
    // the second overload takes one argument
    .First().Invoke(null, new object[]  {
        Type.GetType("System.Threading.StackCrawlMark")
        .GetEnumValues().GetValue(1) // System.Threading.StackCrawlMark.LookForMyCaller
    })

Есть ли какое-либо объяснение, почему он возвращает ноль?

...