2016-07-02 16 views
0

Mein Projekt hat 2 DLLs, eine ist Android-spezifisch und die andere ist plattformunabhängig. Die unabhängige DLL lädt die Android-Assembly und ruft die GetTypes-Methode auf, aber sie gibt nicht alle öffentlichen Klassen zurück. Die Android DLL hat 3 Klassen, 2 sind nur mit statischen Methoden statisch. Nur einer kann instanziiert werden. Die statischen Klassen werden nicht zurückgegeben.Typen nicht in geladenen Assembly gefunden

Class1.cs (kompilieren in 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 (Kompilieren in eine separate DLL in VS):

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

UnityClass.cs (Zu einem leeren GameObject in Unity 5.x zuweisen):

using UnityEngine; 
using System; 

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

Können Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) bereitstellen? – thehennyy

+0

https://gist.github.com/anonymous/7dce68c86ee65281033106705444f147 – Mud

+0

Könnten Sie Ihren Code in Ihre Frage aufnehmen? Links könnten in Zukunft tot sein. – thehennyy

Antwort

0

Werfen Sie einen Blick auf die folgende Notiz in der Msdn bezüglich BindingFlags:

Sie Instanz oder Static zusammen mit Öffentliche oder NonPublic oder keine Mitglieder zurückgegeben werden angeben müssen.

Wenn Sie BindingFlags.Public zu Ihrem Anruf hinzufügen, sollten Sie das Mitglied erhalten.

Auch der vierte Parameter target ist nicht erforderlich, wenn Sie ein statisches Element aufrufen, müssen Sie nicht den Typ als Ziel übergeben, verwenden Sie einfach null.

Als letzte Anmerkung, aus eigener Erfahrung empfehle ich, das gewünschte Mitglied zuerst mit Type.GetMethod, Type.GetField, ... anstelle von InvokeMember zu bekommen. Das gibt Ihnen die Möglichkeit, den Rückgabewert zu überprüfen, um zu überprüfen, dass Sie das Mitglied gefunden haben, nach dem Sie suchen. Das ist besser für das Debuggen sowie sinnvolle Ausnahmen während der Laufzeit.

+0

Danke für die Rückmeldung zu diesem Teil, aber die Ausnahme passiert tatsächlich beim Aufruf des Get-Typs. – Mud