簡體   English   中英

無法在僅反射的上下文中獲取MethodInfo實例

[英]Can't get MethodInfo instance in reflection-only context

以下代碼正確顯示了方法的名稱:

static void Main(string[] args)
{
    try
    {
        Assembly assembly = Assembly.Load("ClassLibrary1");
        foreach (var referencedAssembly in assembly.GetReferencedAssemblies())
        {
            Assembly.Load(referencedAssembly.Name);
        }
        Type bl1Type = assembly.GetType("ClassLibrary1.Bl1");
        var types = new[] {typeof(MyEnum) };
        var method = bl1Type.GetMethod("Method1", BindingFlags.Instance | BindingFlags.Public, Type.DefaultBinder, types, null);
        Console.WriteLine(method == null ? "Method was null" : $"Found {method.Name}");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

但是,如果我嘗試在僅反射的上下文中解析Method1以提高性能並更改對Assembly.Load("ClassLibrary1");的調用Assembly.Load("ClassLibrary1"); Assembly.ReflectionOnlyLoad("ClassLibrary1"); 然后method始終為null,並且不會解析。 關於如何在僅反射的上下文中解析方法的任何想法?

如果您嘗試以下操作,您將看到在列表中找到了您的方法

var methods = bl1Type.GetMethods(BindingFlags.Instance | BindingFlags.Public);

另外,如果您搜索接受string參數的方法,那么它也將起作用

var types = new[] {typeof(string)};

我認為MyEnum對此感到困惑。
如果從第二個dll加載MyEnum,它將起作用

Assembly assembly2 = Assembly.ReflectionOnlyLoad("ClassLibrary2");
Type bl2Type = assembly2.GetType("ClassLibrary2.MyEnum");
var types = new[] { bl2Type };

完整代碼

using System;
using System.Linq;
using System.Reflection;

namespace ReflectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.ReflectionOnlyLoad("ClassLibrary1");
            Type bl1Type = assembly.GetType("ClassLibrary1.Bl1");
            var types = new[] { Assembly.ReflectionOnlyLoad(assembly.GetReferencedAssemblies().Single(a => a.Name == "ClassLibrary2").Name).GetType("ClassLibrary2.MyEnum") };
            //var types = new[] {typeof(MyEnum)}; //doesn't work
            var method = bl1Type.GetMethod("Method1", BindingFlags.Instance | BindingFlags.Public, Type.DefaultBinder, types, null);
            Console.WriteLine(method == null ? "Method was null" : $"Found {method.Name}");
            Console.ReadLine();
        }
    }
}

因此,您的初始代碼不起作用,因為它試圖找到使用其他“ MyEnum”的方法(當然它不存在)

ReflectionOnly上下文是獨立於常規加載程序上下文的加載程序上下文。 它加載程序集和類型的自己的副本,但是mscorlib中的系統類型與常規加載程序上下文共享。

另外,將程序集加載到ReflectionOnly上下文中通常沒有性能優勢。 ReflectionOnly上下文使用與常規程序集完全相同的加載機制,不同之處在於,阻止從它們執行任何代碼的嘗試並抑制了一些健全性檢查( https://blogs.msdn.microsoft.com/junfeng/2004/08/24 / reflection-only-assembly-loading /描述詳細信息)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM