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

时间:2016-07-02 18:58:23

标签: c# unity3d dll reflection

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

Class1.cs(在VS中编译为dll):

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中的空游戏对象):

using UnityEngine;
using System;

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

1 个答案:

答案 0 :(得分:0)

请参阅msdn中有关BindingFlags

的以下说明
  

您必须指定实例静态以及公开 NonPublic ,否则将不会返回任何成员。< / p>

如果您在通话中添加BindingFlags.Public,则应该获得该会员。

在调用静态成员时,不需要第4个参数 target ,您不必将该类型作为目标传入,只需使用null。

作为最后一点,根据个人经验,我建议首先使用Type.GetMethodType.GetField,...而不是InvokeMember来获取所需成员。这使您可以无效检查返回值以验证您是否找到了要搜索的成员。这对于调试以及在运行时抛出有意义的异常更好。