C #: Type.GetType вызывается из DLL на строку типа EXE - PullRequest
2 голосов
/ 10 марта 2009

У меня есть следующий класс в 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 (результат ноль ). Помещая класс XmlSer непосредственно в MyApp.exe код, я правильно получаю тип TestClass .

Проверяя в сети, я обнаружил, что проблема связана со сборками. Это означает, что сборка .exe не видна методу XmlSer.test , поэтому он не может разрешить тип TestClass .

Как решить проблему с поддержкой XmlSer в XmlSer.dll и MyApp.MainClass в MyApp.exe ?

Спасибо.

Alessandro

Ответы [ 3 ]

6 голосов
/ 10 марта 2009

Поскольку они не находятся в одной сборке, вам, вероятно, необходимо включить имя сборки в строку типа:

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);
    }
}
3 голосов
/ 10 марта 2009

Не уверен, но, возможно, попробуйте ser.Test ("MyApp.TestClass, MyApp")?

РЕДАКТИРОВАТЬ: Очевидно, MyApp не XmlSer

0 голосов
/ 10 марта 2009

Я нашел окончательное решение. Я просто получаю вектор всех сборок, загруженных из приложения. Затем в каждой сборке я вызываю Type.GetType, пока не получу действительный тип. Таким образом, вы можете получить каждый тип, который загружен в ваше пространство процесса, независимо от сборки.

Ниже приведен код функции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...