c#:在exe类型字符串上从dll调用Type.GetType

时间:2009-03-10 10:58:13

标签: c# .net reflection

我在 XmlSer.dll

中有以下课程
namespace xmlser
{
        public class XmlSer
        {
                public Type test(string s)
                {
                    return Type.GetType(s);
                }

        //...other code

        }
}

以及 MyApp.exe 中的以下代码,它将 XmlSer.dll 作为参考链接

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);
        }
}

运行MyApp.exe我得 false ,这意味着 ser XmlSer 的实例无法获得的类型Testclass (结果是 null )。 将 XmlSer 类直接放在 MyApp.exe 代码中我正确获取 TestClass 的类型。

检查网络我发现问题与程序集有关。这意味着, XmlSer.test 方法看不到.exe的程序集,因此它无法解析 TestClass 的类型。

如何解决 Myml.exe XmlSer.dll MyApp.MainClass 中维护 XmlSer 的问题>?

感谢。

的Alessandro

3 个答案:

答案 0 :(得分:6)

由于两者不在同一个程序集中,您可能需要在类型字符串中包含程序集名称:

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

如果您只想序列化任意对象,则可以执行以下操作:

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

答案 1 :(得分:3)

不确定,但也许可以尝试ser.Test(“MyApp.TestClass,MyApp”)?

编辑:显然MyApp不是XmlSer

答案 2 :(得分:0)

我找到了一个明确的解决方案。 我只是从应用程序中获取所有程序集的向量。 然后在每个程序集上我调用Type.GetType直到我得到一个有效的Type。 通过这种方式,您可以获得在流程空间中加载的所有类型,无论程序集如何。

以下是该功能的代码。

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;
        }

干杯:)

的Alessandro