Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 1
Регистрация: 27.01.2013
Сообщений: 54

Reflection, вызвать метод из отражаемого dll

17.12.2013, 06:51. Показов 2401. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Лаба по отражению.
Лабу написал - дан dll, надо вывести все его типы, их методы, их конструкторы, их поля и т.д.
Доп. задание - как вызвать метод из этой dll.
Подсказали что надо через Invoke.
На msdn нарыл вот это:
http://msdn.microsoft.com/ru-r... jygHBvemGY
собственно вот код который я написал:

C#
1
2
3
4
5
6
7
8
Assembly file = Assembly.LoadFile(openFileDialog1.FileName);
Type type = file.GetType("TWASerialization.Util.ClassDescriptorsCache");
ConstructorInfo con = type.GetConstructor(new Type[0]);
MethodInfo met = type.GetMethod("ForName");
object mc = con.Invoke(new object[0]);
object[] testtext = new object[1];
testtext[0] = "";
object mel = met.Invoke(mc, testtext);
А вот то что я вывел с помощью отражения из заданного dll:

C#
1
2
3
4
5
6
7
8
private class TWASerialization.Util.ClassDescriptorsCache
{
 Конструкторы:
    private .ctor () { }
 Методы:
    public TWASerialization.Util.ClassDescriptor ForClass (System.Type type) { }
    public TWASerialization.Util.ClassDescriptor ForName (System.String name) { }
}
Проблема в том что компилятор выдаёт мне ошибку "ссылка на объект не указывает на экземпляр объекта"
в строке
C#
1
object mc = con.Invoke(new object[0]);
в чём может быть моя ошибка?

Добавлено через 36 минут
Немного покопался - переписал код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                Assembly file = Assembly.LoadFile(openFileDialog1.FileName);
                Type type = file.GetType("TWASerialization.Util.ClassDescriptor");
                Type[] t=new Type[1];
                t[0] = Type.GetType("System.String");
                ConstructorInfo con = type.GetConstructor(t); //для заполнения con хоть чем-то, а то компиль ругается
                List<ConstructorInfo> constructors = new List<ConstructorInfo>(); 
                constructors.AddRange(type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic));
                foreach (ConstructorInfo constructor in constructors)
                {
                    con = constructor;
                }
                MethodInfo met = type.GetMethod("GetName");
                object mc = con.Invoke(new object[1]{""});
                object[] testtext = new object[1];
                testtext[0] = "";
                object mel = met.Invoke(mc, null);
А вот то что я вывел с помощью отражения из заданного dll:

C#
1
2
3
4
5
6
7
8
9
10
11
12
private class TWASerialization.Util.ClassDescriptor
{
 Конструкторы:
    public .ctor (System.Type type) { }
    public .ctor (System.String name) { }
 Методы:
    public System.Object Instantiate () { }
    public System.String GetName () { }
    public TWASerialization.Util.ClassSubType GetSubType () { }
    public System.Type GetComponentType () { }
    public TWASerialization.Util.FieldDescriptor[] GetFields () { }
}
Проблема в том что компилятор выдаёт мне ошибку System.Reflection.TargetInvocationExcept ion:
Адресат вызова создал исключение. ---> System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
на строке
C#
1
object mc = con.Invoke(new object[1]{""});
в чём может быть проблема? con вроде заполнен правильно - проблема в new object[1]{""}?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2013, 06:51
Ответы с готовыми решениями:

EntryPointNotFoundException при попытке вызвать метод из C++ DLL
Может быть объяснит кто-нибудь почему у меня не получается запустить метод написанный на языке с++ из программы написанной на с# Вообщем...

Как получить через пространство имён "Reflection" данные (методы) из сборки (dll)?
Как получить через пространство имён &quot;рефлекшн&quot; данные(МЕТОДЫ) из сборки? Вот код Вставил ссылку на свой файл. Этот Длл просто...

Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова?
Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова? Вызываемая dll - это ISAPI-приложение.

8
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
17.12.2013, 18:21
1. Переменная con равна null, т.к. в типе "TWASerialization.Util.ClassDescriptorsC ache" нет открытого конструктора.
2. Скорее все циклом вы выбираете не тот конструктор, у меня нет ошибки.
0
1 / 1 / 1
Регистрация: 27.01.2013
Сообщений: 54
17.12.2013, 18:51  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
1. Переменная con равна null, т.к. в типе "TWASerialization.Util.ClassDescriptorsC ache" нет открытого конструктора.
2. Скорее все циклом вы выбираете не тот конструктор, у меня нет ошибки.
странно, а если брейкпоинт поставить туда и смотреть содержимое con то можно увидеть что там что-то лежит...
не могли бы вы ваш код кинуть?

как сюда скрин кинуть? тупой форум блочит ссылки на все хосты картинок.

Добавлено через 42 секунды


Добавлено через 2 минуты
вы не тот код смотрите - первые 2 куска кода пропустите. у меня теперь закрытый класс TWASerialization.Util.ClassDescriptor в котором 2 открытых конструктора
0
17.12.2013, 18:58

Не по теме:

Цитата Сообщение от Kirsan94 Посмотреть сообщение
тупой форум блочит ссылки на все хосты картинок
Достаточно спорное утверждение, с учётом того что в редакторе сообщений присутствует ссылка на описание работы в нём...

Картинку залил.

1
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
17.12.2013, 18:58
Вот классы создал по вашему описанию

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
namespace TWASerialization.Util
{
    public class ClassDescriptor
    {
        public ClassDescriptor(Type type)
        {
        }
 
        public ClassDescriptor(String name)
        {
        }
 
        public String GetName()
        {
            return "Привет";
        }
    }
 
    public class ClassDescriptorsCache
    {
        private ClassDescriptorsCache()
        {
        }
 
        public ClassDescriptorsCache(Type type)
        {
        }
 
        public ClassDescriptorsCache(String name)
        {
        }
    }
 
    internal class Program
    {
        [STAThread]
        private static void Main()
        {
            Assembly file = typeof (Program).Assembly;
            Type type = file.GetType("TWASerialization.Util.ClassDescriptorsCache");
            ConstructorInfo con = type.GetConstructor(new Type[0]);
            MethodInfo met = type.GetMethod("ForName");
            object mc;
            object[] testtext;
            object mel;
            try
            {
                //Здесь падает, т.к. нет открытого конструктора
                mc = con.Invoke(new object[0]);
                testtext = new object[1];
                testtext[0] = "";
                mel = met.Invoke(mc, testtext);
            }
            catch (Exception)
            {
            }
            type = file.GetType("TWASerialization.Util.ClassDescriptor");
            Type[] t = new Type[1];
            t[0] = Type.GetType("System.String");
            con = type.GetConstructor(t); //для заполнения con хоть чем-то, а то компиль ругается
            List<ConstructorInfo> constructors = new List<ConstructorInfo>();
            constructors.AddRange(type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic));
            foreach (ConstructorInfo constructor in constructors)
            {
                con = constructor;
            }
            met = type.GetMethod("GetName");
            mc = con.Invoke(new object[1] { "" });
            testtext = new object[1];
            testtext[0] = "";
            mel = met.Invoke(mc, null);
            Console.ReadKey();
        }
    }
}
0
1 / 1 / 1
Регистрация: 27.01.2013
Сообщений: 54
17.12.2013, 19:34  [ТС]
Цитата Сообщение от NickoTin Посмотреть сообщение

Не по теме:


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

Картинку залил.

Большое спасибо, а то все ссылки на картинку заменялись на звёздочки. Будет время - обязательно почитаю руководство.

Добавлено через 16 минут
Цитата Сообщение от Grishaco Посмотреть сообщение
Вот классы создал по вашему описанию

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
namespace TWASerialization.Util
{
    public class ClassDescriptor
    {
        public ClassDescriptor(Type type)
        {
        }
 
        public ClassDescriptor(String name)
        {
        }
 
        public String GetName()
        {
            return "Привет";
        }
    }
 
    public class ClassDescriptorsCache
    {
        private ClassDescriptorsCache()
        {
        }
 
        public ClassDescriptorsCache(Type type)
        {
        }
 
        public ClassDescriptorsCache(String name)
        {
        }
    }
 
    internal class Program
    {
        [STAThread]
        private static void Main()
        {
            Assembly file = typeof (Program).Assembly;
            Type type = file.GetType("TWASerialization.Util.ClassDescriptorsCache");
            ConstructorInfo con = type.GetConstructor(new Type[0]);
            MethodInfo met = type.GetMethod("ForName");
            object mc;
            object[] testtext;
            object mel;
            try
            {
                //Здесь падает, т.к. нет открытого конструктора
                mc = con.Invoke(new object[0]);
                testtext = new object[1];
                testtext[0] = "";
                mel = met.Invoke(mc, testtext);
            }
            catch (Exception)
            {
            }
            type = file.GetType("TWASerialization.Util.ClassDescriptor");
            Type[] t = new Type[1];
            t[0] = Type.GetType("System.String");
            con = type.GetConstructor(t); //для заполнения con хоть чем-то, а то компиль ругается
            List<ConstructorInfo> constructors = new List<ConstructorInfo>();
            constructors.AddRange(type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic));
            foreach (ConstructorInfo constructor in constructors)
            {
                con = constructor;
            }
            met = type.GetMethod("GetName");
            mc = con.Invoke(new object[1] { "" });
            testtext = new object[1];
            testtext[0] = "";
            mel = met.Invoke(mc, null);
            Console.ReadKey();
        }
    }
}
с вашими классами у меня тоже работает, только надо было название типа сменить т.к. у меня оно включало и пространство имён проекта. а в чём может быть проблема? может быть в том что класс ClassDescriptor private? но он же методы в нём видит, значит и использовать их должен уметь... может всё-же не видит содержимое класса в этом случае?

Добавлено через 11 минут
не, попробовал заприватить -всё-равно всё работает. в чём может быть проблема?
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
17.12.2013, 19:53
Выложите вашу библиотеку сюда, вам быстро помогут.
1
1 / 1 / 1
Регистрация: 27.01.2013
Сообщений: 54
17.12.2013, 19:59  [ТС]
вот сам dll
Вложения
Тип файла: rar 1.rar (8.9 Кб, 10 просмотров)
0
1 / 1 / 1
Регистрация: 27.01.2013
Сообщений: 54
17.12.2013, 20:14  [ТС]
всем спасибо проблема решена. тему можно удалять
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.12.2013, 20:14
Помогаю со студенческими работами здесь

Reflection. Как вызвать конструктор и метод в Main'e?
Доброго всем времени суток. уже 2ой пытаюсь разобраться с reflection, перечитал кучу инфы, пересмотрел много примеров, но так и не смог...

Загрузка нескольких dll в Reflection
Здравствуйте! Есть нужда загрузить несколько dll в один Assembly (Reflection). К примеру, есть код &quot;Assembly a =...

Как вызвать метод info в метод Main и с какими параметрами?
я новичок в C#, так что не судите строго.. Я не думаю что это кому-то покажется сложным, но у меня вызывает дикий ступор(( using...

Из формы вызвать метод который находится в dll
писал имя.метод, не видит тот файл который нужен, в ссылки добавил проект Нужно вызвать при нажатии на кнопку метод который находится в...

Метод Assembly.LoadFrom (System.Reflection) .net3.5 и .net4.0
Всем привет! Возникла проблема такого плана. Утилита была написана под .net 3.5, решил я сменить фреймворк на 4 после этого перестали...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru