Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> По Field сборки получить ImageList 
V
    Опции темы
IEZ
Дата 9.9.2007, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Приветсвую Всех!
В проге получаю Fields другой .Net сборки:

Код

this.Reflection_GetTraceTypeInternal(Assembly.LoadFrom(Path).GetType("Proga.DlgList"));



Код

private String Reflection_GetTraceTypeInternal(Type type)
        {
            string imagelist = "";

            /// <summary>
            /// F I E L D S
            /// </summary>
            FieldInfo[] arrFI = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
            foreach (FieldInfo fi in arrFI) 
            {
                if (fi.FieldType.Name == "ImageList")
                {
                     imagelist = fi.Name; <--------------------------------------- Здесь я получаю имя ImageList .Net сборки
                }
            }

            return imagelist;
        }



Вопрос: а можно ли из полученного получить сам ImageList со всем его содержимым? Или это делается как-то по другому?
Спасибо. 

Это сообщение отредактировал(а) IEZ - 9.9.2007, 03:06


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 9.9.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



да, через FieldInfo.GetValue() или Type.InvokeMember()
Код

MyClass c = new MyClass();

Type t = typeof(MyClass);

FieldInfo[] arrFI = t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo fi in arrFI) 
{
  object o = fi.GetValue(c);




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 9.9.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Цитата(tol05 @  9.9.2007,  11:25 Найти цитируемый пост)
MyClass c = new MyClass();
Type t = typeof(MyClass);

А что это такое? Не могу понять, что за класс?



--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 9.9.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата(IEZ @  9.9.2007,  13:25 Найти цитируемый пост)
А что это такое? Не могу понять, что за класс?

это был пример :( .

ты хочешь получить ImageList, который хранится в каком-то реальном экземпляре какого-то реального класса?

Так вот, для этого в FieldInfo.GetValue() или Type.InvokeMember() нужно передать ссылку на тот объект, который хранит нужный тебе ImageList. 
Вот я и написал, что:
- создается сначала объект класса MyClass (к примеру, ты ж не указал что за класс содержит ImageList)
- получаем инфу о полях класса, экземплятом которого есть этот объект
- перебираем все поля и достаем те значения, которые эти поля имеют в конкретном объекте с именем "с" ....

Ладно... Давай по твоему коду:
Код

        {
            string imagelist = "";

            /// <summary>
            /// F I E L D S
            /// </summary>
            FieldInfo[] arrFI = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
            foreach (FieldInfo fi in arrFI) 
            {
                if (fi.FieldType.Name == "ImageList")
                {
                     imagelist = fi.Name; 
                     ImageList list = (ImageList)fi.GetValue(obj);//obj - ссылка на объект, хранящий ImageList
                }
            }

            return imagelist;
        }

Экземпляров класса MyClass у тебя в программе могут быть сотни, нужно же указать, ImageList какого из них тебе нужен?


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 9.9.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Цитата(tol05 @  9.9.2007,  13:45 Найти цитируемый пост)
//obj - ссылка на объект, хранящий ImageList

Я конечно туплю, но как эту ссылку получить?


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 9.9.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(tol05 @  9.9.2007,  13:45 Найти цитируемый пост)
Экземпляров класса MyClass у тебя в программе могут быть сотни, нужно же указать, ImageList какого из них тебе нужен?

Это может быть проблемой, т.к. в первом посте ничего про объекты не говорится, а только грузится DLL и получается инфа о типах.


--------------------
user posted image
PM MAIL WWW   Вверх
IEZ
Дата 9.9.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Цитата(mr.DUDA @  9.9.2007,  14:14 Найти цитируемый пост)
Это может быть проблемой, т.к. в первом посте ничего про объекты не говорится, а только грузится DLL и получается инфа о типах.

Вот как выглядит весь код:
Код

            string Path = @"D:\Proga\Proga.exe"; /// Путь к сборке
            string imagelist = ""; /// Имя ImageList
            Assembly assembly = Assembly.LoadFrom(Path);
            Type type = assembly.GetType("Proga.DlgList");
            /// <summary>
            /// F I E L D S
            /// </summary>
            FieldInfo[] arrFI = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
            foreach (FieldInfo fi in arrFI)
            {
                if (fi.FieldType.Name == "ImageList")
                {
                     imagelist = fi.Name; /// Здесь я получаю имя ImageList .Net сборки
                }
            }


Это сообщение отредактировал(а) IEZ - 9.9.2007, 15:00


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 9.9.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



IEZ, теперь понятно.  Но ведь ты хочешь 
Цитата(IEZ @  9.9.2007,  03:04 Найти цитируемый пост)
получить сам ImageList со всем его содержимым

а как можно получить из объекта содержимое, если ты сам объект не создал? Пока ты только читаешь его метаданные и все. Справочную информацию о типе получаешь.
Чтобы получить заполненный ImageList сначала нужно создать объект класса Proga.DlgList, инициализировать его (и его член - ImageList заполнить), а потом уже что-то получать smile

вот изменения в коде
Код

string Path = @"D:\Proga\Proga.exe"; /// Путь к сборке
string imagelist = ""; /// Имя ImageList
Assembly assembly = Assembly.LoadFrom(Path);
Type type = assembly.GetType("Proga.DlgList");
Proga.DlgList obj = Activator.CreateInstance(type) as Proga.DlgList;
/// <summary>
/// F I E L D S
/// </summary>
FieldInfo[] arrFI = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo fi in arrFI)
{
    if (fi.FieldType.Name == "ImageList")
    {
      imagelist = fi.Name; /// Здесь я получаю имя ImageList .Net сборки
      ImageList list = (ImageList)fi.GetValue(obj);
    }
}

Опять же, это работает если при создании объекта Proga.DlgList конструктором по умолчанию он инициализирует свой ImageList. Иначе список тебе вернется пустым.

Это сообщение отредактировал(а) tol05 - 9.9.2007, 20:31


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 9.9.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Цитата(tol05 @  9.9.2007,  20:29 Найти цитируемый пост)
Proga.DlgList obj

Не совсем понятное определение объекта.
Цитата(tol05 @  9.9.2007,  20:29 Найти цитируемый пост)
это работает если при создании объекта Proga.DlgList конструктором по умолчанию он инициализирует свой ImageList

А как это сделать?

Это сообщение отредактировал(а) IEZ - 9.9.2007, 22:01


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 9.9.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



может ты опишешь свою задачу полностью? Зачем тебе FieldInfo, что такое Proga.exe?
Это .Net приложение? Работает Proga.exe когда твое приложение работает?

Цитата(IEZ @  9.9.2007,  22:00 Найти цитируемый пост)
А как это сделать?

Что сделать? Я не знаю как и когда DlgList заполняет свой список. Вариантов взаимодействия много. Опять же повторяю, опиши задачу свою.

а по поводу 
Цитата(IEZ @  9.9.2007,  22:00 Найти цитируемый пост)
Не совсем понятное определение объекта

ты используешь перегрузку метода
Код

public virtual Type GetType (string name)

где name - полносью квалифицированное имя типа. Вот я и предположил, что полное имя будет "Proga.DlgList". Но я не претендую именно на это имя и ты можешь его изменить на реальное.  smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 9.9.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Цитата(tol05 @  9.9.2007,  22:16 Найти цитируемый пост)
может ты опишешь свою задачу полностью?

Есть прога, которой (зная путь к другой сборке) необходимо из нее получить ImageList с изображениями и их номерами по порядку.

Это сообщение отредактировал(а) IEZ - 9.9.2007, 22:43


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 10.9.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Когда твой класс при своем создании заполняет свой ImageList - тогда подходит мой вариант кода (см. выше)
Если список картинок заполняется при каких-то операциях с классом - то нужно на созданном obj вызвать эти действия (через InvokeMember, например) и потом получить value. 
А вообще-то ИМХО такие вещи делают через ремотинг, а не через рефлексию.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 10.9.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Цитата(tol05 @  10.9.2007,  13:06 Найти цитируемый пост)
такие вещи делают через ремотинг

Где почитать или примеры можно посмотреть?


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
tol05
Дата 10.9.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



почитать - в учебниках.
"C# 2005 дл\ профессионалов"
Троелсен
Маклин и др,  "Microsoft .NET Remoting"

пример (клиент-сервер-удаленный) объект набросал такой:
удаленный объект (RemoteObj.dll)
Код

namespace RemoteObj
{
    public class RemObj : MarshalByRefObject 
    {
        private ImageList list;

        public RemObj()
        {
            list = new ImageList();    
            list.Images.Add(...);
        }

        //допустим, что картинки в списке только здесь появляются, а не при создании объекта
        public void SetImages()
        {
            list.Images.Add(Image.FromFile(...));
            list.Images.Add(Image.FromFile(...));
        }

        public Image[] GetImages() //ImageList не поддерживает серилизацию, перекидываю все в массив
        {
            Image[] result = new Image[list.Images.Count];
            for(int i = 0; i < list.Images.Count; i++)
            {
                result[i] = list.Images[i];
            }
            return result;
        }
    }
}

сервер (Proga.exe)
Код

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpChannel channel = new TcpChannel(9900);
            ChannelServices.RegisterChannel(channel, false);

            RemotingConfiguration.RegisterActivatedServiceType(typeof(RemObj));
            Console.ReadLine();
        }
    }
}


клиент (Client.exe)
Код

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpChannel channel = new TcpChannel();
            ChannelServices.RegisterChannel(channel, false);

            RemotingConfiguration.RegisterActivatedClientType(typeof(RemObj), "tcp://localhost:9900");
            RemObj obj = new RemObj();

                        //что-то делаем с obj...
                        obj.SetImages();
                        //еще что-то делаем...

            Image[] list = obj.GetImages();//достаем картинки. Для наглядности перекинем в локальный список
            ImageList newlist = new ImageList();

            foreach(Image image in list)
            {
               newlist.Images.Add(image);
            }
            Console.ReadLine();
        }
    }
}

запускаешь сервер, потом клиент.

через доменный ремоутинг все гораздо проще. Всего одна сборка клиента, загружающая в своей домен сборку Proga
Код

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("Proga", "Proga.RemObj");
            Type type = obj.GetType();
            //и сразу что-то делаем с объектом
            type.InvokeMember("SetImages", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, 
                null, obj, null);

            FieldInfo[] fi = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach(FieldInfo info in fi)
            {
                if(info.FieldType.Name == "ImageList")
                {
                    ImageList list = info.GetValue(obj) as ImageList;
                }
            }
        }
    }
}



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
IEZ
Дата 10.9.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 10.2.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 3



tol05, спасибо за помощь. smile 


--------------------
"Нужно делать так, как нужно, а как не нужно, делать не нужно" (с) Винни-Пух.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1395 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.