2009-03-10 6 views
2

Ich habe die folgende Klasse in XmlSer.dllC#: Type.GetType aus einer DLL auf exe Typ string genannt

namespace xmlser 
{ 
     public class XmlSer 
     { 
       public Type test(string s) 
       { 
        return Type.GetType(s); 
       } 

     //...other code 

     } 
} 

und der folgende Code in MyApp.exe, die XmlSer Links .dll als Referenz

namespace MyApp 
{ 
    public class TestClass 
    { 
     public int f1 = 1; 
     public float f2 = 2.34f; 
     public double f3 = 3.14; 
     public string f4 = "ciao"; 
    } 

    class MainClass 
    { 

     public static void Main(string[] args) 
     { 
      TestClass tc = new TestClass(); 
      XmlSer ser = new XmlSer(); 
      Console.WriteLine(ser.test("MyApp.TestClass")!=null); 
     } 
} 

Lauf MyApp.exe I falsch bekommen, das bedeutet, dass ser Instanz von XmlSer ist nicht in der Lage, den Typ Testklasse zu erhalten (das Ergebnis ist Null). Setzen XmlSer Klasse direkt in MyApp.exe Code ich bekomme richtig den Typ TestClass.

Überprüfung im Internet habe ich festgestellt, dass das Problem mit den Baugruppen zusammenhängt. Das bedeutet, dass die Assembly von .exe für die XmlSer.test Methode nicht sichtbar ist, so dass es den Typ TestClass nicht auflösen kann.

Wie kann ich das Problem maintaing XmlSer in XmlSer.dll und MyApp.MainClass in MyApp.exe lösen?

Danke.

Alessandro

Antwort

6

Da die beiden nicht in derselben Baugruppe sind, müssen Sie wahrscheinlich den Namen der Assembly in der Art Zeichenkette enthalten:

Console.WriteLine(ser.test("MyApp.TestClass, MyApp")!=null); 

Wenn alles, was Sie Willst du tun ist serialisieren beliebige Objekte, können Sie Folgendes tun:

public static class Serialization 
{ 
    public static void Serialize(object o, Stream output) 
    { 
     var serializer = new XmlSerializer(o.GetType()); 
     serializer.Serialize(output, o); 
    } 
} 
+0

Wie kann ich die ID des Anrufers Baugruppe (MyApp in diesem Fall) zu bekommen? Wie wäre es, wenn ich den in einer zweiten DLL enthaltenen Typ erkennen möchte? Gibt es keine Möglichkeit, die Baugruppe eines bestimmten Typs automatisch zu erkennen? Ich suche nach etwas wie einem globalen GetType, der den Typ in allen Assemblies erkennt. Danke – alexroat

+0

Sie erhalten nicht die ID des Anrufers. Der Aufrufer kennt die Assembly des Aufrufers, also die Assembly des Typs. Sie möchten keine Methode, die jede Assembly durchsucht. Es könnte sehr viele von ihnen geben, und Sie müssen möglicherweise Metadaten laden, um die Suche durchzuführen. –

+0

Was ist Ihr Hauptziel hier? Was versuchst du zu erreichen? Ihre Klasse heißt "XmlSer". Versuchen Sie XML-Serialisierung durchzuführen? Bitte geben Sie einen Zusammenhang, und wir können vielleicht besser helfen. –

3

Nicht sicher, aber vielleicht versuchen ser.Test ("MyApp.TestClass, MyApp")?

EDIT: Offensichtlich MeineAnw nicht XmlSer

0

Ich habe gegründet d eine endgültige Lösung. Ich bekomme einfach den Vektor aller Baugruppen aus der Anwendung geladen. Dann rufe ich auf jeder Assembly Type.GetType auf, bis ich einen gültigen Type bekomme. Auf diese Weise können Sie jeden Typ, der in Ihren Prozessbereich geladen wird, unabhängig von der Baugruppe abrufen.

Dies ist der Code der Funktion.

public static Type GetGlobalType(string s) 
     { 
      Type t=null; 
      Assembly[] av = AppDomain.CurrentDomain.GetAssemblies(); 
      foreach (Assembly a in av) 
      { 
       t=Type.GetType(s + "," + a.GetName()); 
       if (t != null) 
        break; 
      } 
      return t; 
     } 

Prost :)

Alessandro

+0

Was passiert, wenn eine große Anzahl von Assemblys in die AppDomain geladen wird? –

+0

Einfach, es wird lange dauern, um den Typ mit Reflexion aufzulösen. Im Falle einer Mehrfachdeklaration wird das erste Vorkommen von Typ in AppDomain genommen und dieses Verhalten ist genau das selbe einer Java Anwendung, die mehrere Jars verbindet, das ist was ich gesucht habe. – alexroat