【问题标题】:Types not found in loaded assembly在加载的程序集中找不到类型
【发布时间】:2016-07-02 18:58:23
【问题描述】:

我的项目有 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();
    }  
}

【问题讨论】:

标签: c# unity3d dll reflection


【解决方案1】:

请查看 msdn 中有关 BindingFlags 的以下注释:

您必须指定 InstanceStatic 以及 PublicNonPublic 否则不会返回任何成员。

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

另外第四个参数target在调用静态成员时也不是必须的,你不需要传入类型作为target,使用null即可。

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

【讨论】:

  • 感谢您对此部分的反馈,但异常实际上发生在 get types 调用上。
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多