C #: Type.GetType вызывается из DLL на строку типа EXE

2

У меня есть следующий класс в 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.

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

Как я могу решить проблему maintaing XmlSer в XmlSer.dll и MyApp.MainClass в MyApp.exe?

Спасибо.

Алессандро

Теги:
reflection

3 ответа

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);
    }
}
  • 0
    Как я могу получить идентификатор сборки вызывающего абонента (в данном случае MyApp)? А что если я хотел бы распознать тип, содержащийся во втором .dll? Нет ли способа автоматически определять сборку заданного типа? Я ищу что-то вроде глобального GetType, который распознает тип во всех сборках. Спасибо
  • 0
    Вы не получаете идентификатор звонящего. Вызывающая сторона знает сборку вызывающей стороны, следовательно, сборку типа. Вам не нужен метод, который ищет каждую сборку. Их может быть очень много, и вам может понадобиться загрузить метаданные для поиска.
Показать ещё 3 комментария
3

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

EDIT: Очевидно, MyApp не XmlSer

0

Я нашел окончательное решение. Я просто получаю вектор всех сборок, загруженных из приложения. Затем на каждой сборке я вызываю 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;
        }

Приветствия:)

Алессандро

  • 0
    Что произойдет, если в AppDomain загружено большое количество сборок?
  • 0
    Просто, потребуется много времени, чтобы разрешить тип с помощью отражения. В случае многократного объявления это будет первое вхождение типа в AppDomain, и это поведение точно такое же, как и в Java-приложении, которое связывает несколько jar-файлов, это то, что я искал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню