在加载的程序集中找不到类型

本文关键字:集中 找不到 类型 程序集 程序 加载 | 更新日期: 2023-09-27 17:54:01

我的项目有两个dll,一个是Android特定的,另一个是独立于平台的。独立的DLL加载Android程序集并调用GetTypes方法,但它不返回所有的公共类。Android DLL有3个类,其中2个是静态的,只有静态方法。只能实例化一个。不返回静态类。

Class1.cs(编译dll在VS):

using System;
using System.Reflection;
namespace ClassLibrary1
{
    public class Class1
    {
        public void test()
        {
            Assembly asm = Assembly.Load("ClassLibrary2");
            Type T = asm.GetType("ClassLibrary2.Class2");
            T.InvokeMember("Method", BindingFlags.Static |    BindingFlags.InvokeMethod, null, T, null);
        }
    }
}

Class2.cs(在VS中编译成一个单独的dll):

namespace ClassLibrary2
{
    public static class Class2
    {
        public static void Method()
        {
            return;
        }
    }
}

UnityClass.cs(在Unity 5.x中分配给一个空的GameObject):

using UnityEngine;
using System;
class UnityClass : MonoBehaviour
{
    public void Start()
    {
        var x = new ClassLibrary1.Class1();
        x.test();
    }  
}

在加载的程序集中找不到类型

查看msdn中关于BindingFlags的注释:

必须指定InstanceStatic以及PublicNonPublic,否则不返回成员。

如果您将BindingFlags.Public添加到您的呼叫中,您应该获得该成员。

第四个参数target在调用静态成员时是不需要的,您不必将类型作为target传递,只需使用null。

作为最后一个注意事项,根据个人经验,我建议首先使用Type.GetMethod, Type.GetField,…而不是使用InvokeMember。这样就可以对返回值进行null检查,以验证是否找到了正在搜索的成员。这对于调试以及在运行时抛出有意义的异常更有利。