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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Извлечение метаданных, Нужно извлечь из длл или exe 
V
    Опции темы
Сарт
Дата 21.5.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 0



Код

Разработать приложение (Windows Forms (C#)), которое получает на 

входе некоторую библиотеку (сборку (*.dll, *.exe)) и проводит анализ 

ее метаданных. Результатом анализа должен стать набор записей, 

описывающих структуру всех входящих в сборку типов являющихся классами, а именно:

1. Имя класса

2. Список методов класса (для каждого метода указать тип возвращаемого

значения, имена формальных параметров и их тип)

3. Список свойств класса  (для каждого свойства указать его тип).

Данный набор должен быть предельно ясно структурирован и помещен в

выходной файл в формате XML (структуру файла определить самостоятельно) . 

Включить в выходной файл минимальную информацию о сборке, на  Ваше усмотрение.

Предусмотреть наличие вложенных классов.  



Вопрос- куда копать? Ессно, что хочется сделать самому, но подкиньте пару ссылок, а то я даже не подозреваю как сделать=)
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Сарт
Дата 21.5.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 0



Так, понял что копать нужно в сторону System.Reflections.....Вопрос пока не закрыва, ибо еще не сделал=)
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Сарт
Дата 21.5.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 0



Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;

namespace SamSolutionsSartTest
{
    public partial class MForm : Form
    {
        public MForm()
        {
            InitializeComponent();
            lblError.Visible = false;
        }

        private void MForm_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Assembly asb = null;
            try
            {
                asb = Assembly.LoadFrom(pathAssembly.Text);
                MessageBox.Show(asb.ToString());
                ListAllTypes(asb);
            }
            catch (Exception exc)
            {
                lblError.Text = exc.Message;
                lblError.Visible = true;
            }
            

        }
        private  void ListAllTypes(Assembly a)
        {
            Type[] types = a.GetTypes();
            foreach (Type t in types)
            {
                MessageBox.Show(t.ToString());
            }
            Type minivan = a.GetType(pathAssembly.Text);
            MemberInfo[] mi = minivan.GetMembers();
            foreach (MemberInfo m in mi)
            {
                MessageBox.Show(m.MemberType.ToString());
            }
        }

    
    }
}


Вызывает затруднение следующая строчка

Код

Type minivan = a.GetType(pathAssembly.Text);


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

А что делать если я его не знаю?=)
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
archeg
Дата 22.5.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 27



Код

foreach (Type t in types)
            {
                MessageBox.Show(t.ToString());
            }

Этим ты перебираешь все классы в foreach. ну вот, так в чем проблема? таким образом должно быть что-то такое:
Код

foreach (Type minivan in types)
            {
            MemberInfo[] mi = minivan.GetMembers();
            foreach (MemberInfo m in mi)
             {
                 MessageBox.Show(m.MemberType.ToString());
             }
            }



--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Сарт
Дата 22.5.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 0



Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;

namespace SamSolutionsSartTest
{
    public partial class MForm : Form
    {
        public MForm()
        {
            InitializeComponent();
            lblError.Visible = false;
        }

        private void MForm_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Assembly asb = null;
            AssemblyName asmName = new AssemblyName();
            asmName.Name = pathAssembly.Text;
            try
            {
                lblError.Visible = false;
                asb = Assembly.LoadFrom(pathAssembly.Text);
                MessageBox.Show(asb.ToString());
                
                ListAllTypes(asb);
                

            }
            catch (Exception exc)
            {
                lblError.Text = exc.Message;
                lblError.Visible = true;
            }
            

        }
        private  void ListAllTypes(Assembly a)
        {
            Type[] types = a.GetTypes();
            foreach (Type t in types)
            {
                MessageBox.Show(t.ToString());
                ListAllMembers(a);
            }
           
        }
        private void ListAllMembers(Assembly a)
        {
            Type minivan = a.GetType();
            MemberInfo[] mi = minivan.GetMembers();
            foreach (MemberInfo m in mi)
            {
                MessageBox.Show(m.MemberType.ToString()+" "+m);
               
            }
            MethodInfo[] mi2 = minivan.GetMethods();
            foreach (MethodInfo p in mi2)
            {
                MessageBox.Show("Params for " + p.Name);
                ParameterInfo[] myParams = p.GetParameters();
                MessageBox.Show("Method has " + myParams.Length + " params");
                foreach (ParameterInfo pi in myParams)
                {
                    MessageBox.Show("Param name: " + pi.Name);
                    MessageBox.Show("Param type: " + pi.ParameterType);
                }
            }
        }
        
    
    }

}


Сделал так, но возник вопрос- как избавиться от  "левых"  методов? Как я понял, в моем коде еще выводяться все методы, которые входят в подключаемые библиотеки, например mscor.lib. 

И как лучше забить все это в ХМЛ? Преполагаю вставлять в цикл..но что то мне это не нравиться...
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Naum
Дата 22.5.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Цитата(Сарт @  22.5.2007,  11:54 Найти цитируемый пост)
как избавиться от  "левых"  методов

А там и нет никаких "левых" методов. У типа вообще не может быть никаких "левых" методов.  smile То, что ты нызываешь "левыми" методами, если я правильно понял, есть методы, унаследованные от классов, определенных в других библиотеках. Например, метод ToString() первоначально имплементирова для класса System.Object в библиотеке mscorlib.dll, однако, у меня язык не повернется назвать его "левым" для любого класса.  smile 



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Stepan_Lameroff
Дата 22.5.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 14



Небольшой пример.
Может поможет  smile 

OUTPUT:
Код

<?xml version="1.0" encoding="utf-8"?>
<Assembly fullName="Assembly2Xml, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Assembly2Xml" entryPointName="Assembly2Xml.Program Main(System.String[])">
    <ReferencedAssembly>mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ReferencedAssembly>
    <ReferencedAssembly>System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ReferencedAssembly>
    <Module name="Assembly2Xml.exe" fullName="D:\WORK\VS2005_Projects\Assembly2Xml\Assembly2Xml\bin\Debug\Assembly2Xml.exe">
        <Type baseTypeFullName="System.Object" fullName="Assembly2Xml.Program" name="Program" namespace="Assembly2Xml" isAbstract="False" isAnsiClass="True" IsArray="False" isAutoClass="False" isAutoLayout="True" isByRef="False" isClass="True" isCOMObject="False" isContextful="False" isEnum="False" isExplicitLayout="False" isImport="False" isInterface="False" isLayoutSequential="False" isMarshalByRef="False" isNestedAssembly="False" isNestedFamANDAssem="False" isNestedFamily="False" isNestedFamORAssem="False" isNestedPrivate="False" isNestedPublic="False" isNotPublic="True" isPointer="False" isPrimitive="False" isPublic="False" isSealed="False" isSerializable="False" isSpecialName="False" isUnicodeClass="False" isValueType="False">
            <Constructor callingConvention="Standard, HasThis" isAbstract="False" isAssembly="False" isFamily="False" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isFinal="False" isHideBySig="True" isPrivate="False" isPublic="True" isSpecialName="True" isStatic="False" isVirtual="False" signature="Assembly2Xml.Program .ctor()" implFlags="Managed" />
            <Method callingConvention="Standard" isAbstract="False" isAssembly="False" isFamily="False" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isFinal="False" isHideBySig="True" isPrivate="True" isPublic="False" isSpecialName="False" isStatic="True" isVirtual="False" name="Main" declaringTypeFullName="Assembly2Xml.Program" returnTypeFullName="System.Void" implFlags="Managed" isNewSlot="False" signature="Assembly2Xml.Program Main(System.String[])">
                <Parameter name="args" type="System.String[]" position="0" />
            </Method>
        </Type>
        <Type baseTypeFullName="System.Object" fullName="Assembly2Xml.XmlAdapters.XmlAdapter" name="XmlAdapter" namespace="Assembly2Xml.XmlAdapters" isAbstract="False" isAnsiClass="True" IsArray="False" isAutoClass="False" isAutoLayout="True" isByRef="False" isClass="True" isCOMObject="False" isContextful="False" isEnum="False" isExplicitLayout="False" isImport="False" isInterface="False" isLayoutSequential="False" isMarshalByRef="False" isNestedAssembly="False" isNestedFamANDAssem="False" isNestedFamily="False" isNestedFamORAssem="False" isNestedPrivate="False" isNestedPublic="False" isNotPublic="False" isPointer="False" isPrimitive="False" isPublic="True" isSealed="False" isSerializable="False" isSpecialName="False" isUnicodeClass="False" isValueType="False">
            <Field name="TagName" type="System.String" isAssembly="False" isFamily="False" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isInitOnly="True" isLitteral="False" isNotSerialized="False" isPinvokeImpl="False" isPrivate="False" isPublic="True" isSpecialName="False" isStatic="False" />
            <Field name="Instance" type="Assembly2Xml.XmlAdapters.XmlAdapter" isAssembly="False" isFamily="False" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isInitOnly="True" isLitteral="False" isNotSerialized="False" isPinvokeImpl="False" isPrivate="False" isPublic="True" isSpecialName="False" isStatic="True" />
            <Constructor callingConvention="Standard, HasThis" isAbstract="False" isAssembly="False" isFamily="False" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isFinal="False" isHideBySig="True" isPrivate="True" isPublic="False" isSpecialName="True" isStatic="False" isVirtual="False" signature="Assembly2Xml.XmlAdapters.XmlAdapter .ctor()" implFlags="Managed" />
            <Constructor callingConvention="Standard, HasThis" isAbstract="False" isAssembly="False" isFamily="True" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isFinal="False" isHideBySig="True" isPrivate="False" isPublic="False" isSpecialName="True" isStatic="False" isVirtual="False" signature="Assembly2Xml.XmlAdapters.XmlAdapter .ctor(System.String)" implFlags="Managed">
                <Parameter name="tagName" type="System.String" position="0" />
            </Constructor>
            <Constructor callingConvention="Standard" isAbstract="False" isAssembly="False" isFamily="False" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isFinal="False" isHideBySig="True" isPrivate="True" isPublic="False" isSpecialName="True" isStatic="True" isVirtual="False" signature="Assembly2Xml.XmlAdapters.XmlAdapter .cctor()" implFlags="Managed" />
            <Method callingConvention="Standard, HasThis" isAbstract="False" isAssembly="False" isFamily="True" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isFinal="False" isHideBySig="True" isPrivate="False" isPublic="False" isSpecialName="False" isStatic="False" isVirtual="True" name="ReInit" declaringTypeFullName="Assembly2Xml.XmlAdapters.XmlAdapter" returnTypeFullName="System.Void" implFlags="Managed" isNewSlot="True" signature="Assembly2Xml.XmlAdapters.XmlAdapter ReInit()" />
            <Method callingConvention="Standard, HasThis" isAbstract="False" isAssembly="False" isFamily="True" isFamilyAndAssembly="False" isFamilyOrAssembly="False" isFinal="False" isHideBySig="True" isPrivate="False" isPublic="False" isSpecialName="False" isStatic="False" isVirtual="False" name="GetType" declaringTypeFullName="Assembly2Xml.XmlAdapters.XmlAdapter" returnTypeFullName="System.Type" implFlags="Managed" isNewSlot="False" signature="Assembly2Xml.XmlAdapters.XmlAdapter GetType(System.String)">
                <Parameter name="typeFullName" type="System.String" position="0" />
            </Method>
        </Type>

...................................................
...................................................
...................................................

    </Module>
</Assembly>



Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Assembly2Xml.zip 11,94 Kb
PM MAIL   Вверх
Сарт
Дата 22.5.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 0



Сенкс=) Тут точно можно найти то что нужно=)
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Сарт
Дата 22.5.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 0



Возможно сделал не все и коряво но тем не менее
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using System.Xml;

namespace SamSolutionsSartTest
{
    public partial class MForm : Form
    {
        public MForm()
        {
            InitializeComponent();
            lblError.Visible = false;
        }

        private void MForm_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Assembly asb = null;
            AssemblyName asmName = new AssemblyName();
            asmName.Name = pathAssembly.Text;
            try
            {
                lblError.Visible = false;
                asb = Assembly.LoadFrom(pathAssembly.Text);
                ListAllTypes(asb);


            }
            catch (Exception exc)
            {
                lblError.Text = exc.Message;
                lblError.Visible = true;
            }


        }
        private void ListAllTypes(Assembly a)
        {
            XmlTextWriter writer = new XmlTextWriter(@"C:\1.xml", null);
            writer.WriteStartDocument();
            writer.WriteStartElement("DisAssemblingInfo");

            Type[] classes = a.GetTypes();
            foreach (Type t in classes)
            {

                
                writer.WriteElementString(t.ToString(), t.ToString());
                Type methods = a.GetType();
                MemberInfo[] mi = methods.GetMembers();
                foreach (MemberInfo m in mi)
                {
                   writer.WriteElementString(m.MemberType.ToString(), m.ToString());
                }
             //   MethodInfo[] imeth = methods.GetMethods();
               // foreach (MethodInfo im in imeth)
             //   {
             //     ParameterInfo[] parametrs = im.GetParameters();
             //     foreach (ParameterInfo pi in parametrs)
            //     {
                    
           //         writer.WriteElementString("dsa", pi.Name.ToString());
           //     }
           //     }
                //ListAllMembers(a);
            }
            writer.WriteEndElement();
            writer.Close();
        }

    }
}



    

Выводит методы\свойства поклассово. Проблема только в том что выводит лишнее=)
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Naum
Дата 23.5.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Сарт, объясни, плиз, что значит "лишнее". Приведи пример - "Класс - лишний член класса". ;) 


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Stepan_Lameroff
Дата 23.5.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: нет
Всего: 14



Обратите внимание на BindingFlags Enumeration 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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