1

Тема: Вичитування класів і методів з бібліотеки

Привіт, форумчани. Є наступне завдання (wpf додаток):
1. Обираємо папку
2. Вичитуємо з папки і підпапок .длл файли і додаємо їх в Ліст-бокс
3. тицькаємо мишкою на вподобаний файл і в наступному Ліст-боксі мають з*явитися усі класи цієї бібліотеки
4. тицькаємо на клас і з*являються усі методи класу.

У мене проблема в пункті 3. Щоб вичитати класи, я створюю AppDomain та Assembly. Але при завантаженні файлу в Assembly, викидає FileLoadException помилку. На мсдн прочитав, що передаватись має повний шлях, що, здається, і роблю. Чи може таке бути, що у мене немає прав доступу?

Ось бекграунд код:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;

using WinForms = System.Windows.Forms;

namespace HomeWork_DLL_Reflection
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void bt_ChooseFolder_Click(object sender, RoutedEventArgs e) // відкриваємо вікно вибору папки та передаємо шлях в текст-бокс
        {
            WinForms.FolderBrowserDialog folderDialog = new WinForms.FolderBrowserDialog();
            folderDialog.ShowNewFolderButton = false;
            folderDialog.SelectedPath = System.AppDomain.CurrentDomain.BaseDirectory;
            WinForms.DialogResult result = folderDialog.ShowDialog();
            if (result == WinForms.DialogResult.OK)
            {
                tb_URL.Text = folderDialog.SelectedPath;
            }
        }

        private List<String> DirSearch(string sDir) // пошук файлів в папці та підпапках і додавання їх в Ліст
        {
            List<String> files = new List<String>();
            try
            {
                foreach (string f in Directory.GetFiles(sDir, "*.dll"))
                {
                    files.Add(f);
                }
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    files.AddRange(DirSearch(d));
                }
            }
            catch (System.Exception excpt)
            {
                MessageBox.Show(excpt.Message);
            }

            return files;
        }

        private void bt_OK_Click(object sender, RoutedEventArgs e) // додаємо усі знайдені бібліотеки в Ліст-бокс форми
        {
            List<String> dlls = new List<string>();
            if (tb_URL.Text != "")
            {
                dlls = DirSearch(tb_URL.Text);
            }
            foreach (var item in dlls)
            {
                listBox_Dlls.Items.Add(item);
            }
        }

        private void listBox_Dlls_SelectionChanged(object sender, SelectionChangedEventArgs e) // коли обираємо бібліотеку, вичитуємо її класи і передаємо в Ліст-бокс
        {
            //Assembly addDLL = Assembly.LoadFile(listBox_Dlls.SelectedItem.ToString());


            AppDomain domain = AppDomain.CreateDomain("ClassesAndMethodsDomain");
            Assembly asm = domain.Load(AssemblyName.GetAssemblyName(listBox_Dlls.SelectedItem.ToString())); // викидає помилку про неможливість завантаження файлу
            var classes = asm.GetTypes(); // you can use GetTypes to get all classes in that assembly
            foreach (var c in classes)
            {
                listBox_ClassesMethods.Items.Add($"Class {c.Name} methods :");
                // you can get all methods which is defined in this class with GetMethods
                var methods = c.GetMethods();
                foreach (var item in methods)
                {
                    listBox_ClassesMethods.Items.Add(item.Name);
                }
                // or you can get all properties defined in this class
                var props = c.GetProperties();
                listBox_ClassesMethods.Items.Add($"Class {c.Name} properties :");
                foreach (var item in props)
                {
                    listBox_ClassesMethods.Items.Add(item.Name);
                }
                listBox_ClassesMethods.Items.Add("");
            }

        }
    }
}
Post's attachments

2017-09-25_14-57-53.jpg 256.29 kb, 182 downloads since 2017-09-25 

2

Re: Вичитування класів і методів з бібліотеки

Шлях вказується наступним чином:

C:\\the\\path\\to\\the\\file

Поміняйте "\\" на "/", щоб було

C:/the/path/to/the/file

3

Re: Вичитування класів і методів з бібліотеки

А файл, який ви відкриваєте, є збіркою .Net Framework?

4

Re: Вичитування класів і методів з бібліотеки

koala написав:

А файл, який ви відкриваєте, є збіркою .Net Framework?

Так. С#-ні проекти

5

Re: Вичитування класів і методів з бібліотеки

LoganRoss написав:

Поміняйте "\\" на "/", щоб було

C:/the/path/to/the/file

Тобто пройтися по строці і замінити усі бекслеші на звичайні?

6

Re: Вичитування класів і методів з бібліотеки

boshik1983 написав:
koala написав:

А файл, який ви відкриваєте, є збіркою .Net Framework?

Так. С#-ні проекти

І зібрані тією ж версією VS?
Бо виглядає, що воно чутливе.

Подякували: leofun011

7

Re: Вичитування класів і методів з бібліотеки

koala написав:
boshik1983 написав:
koala написав:

А файл, який ви відкриваєте, є збіркою .Net Framework?

Так. С#-ні проекти

І зібрані тією ж версією VS?
Бо виглядає, що воно чутливе.


Саме так, версія та сама. Завтра спробую слеші замінити, бо проект на роботі, і відпишусь.

Подякували: koala1

8

Re: Вичитування класів і методів з бібліотеки

Щось нічого не виходить навіть після заміни слешів в строці. Прикріпив одну з бібліотек, яку намагаюся прочитати

Post's attachments

Calculation.dll 5 kb, 475 downloads since 2017-09-26 

9

Re: Вичитування класів і методів з бібліотеки

Я глянув на ексепшн що був в мене прочитав оце https://docs.microsoft.com/en-us/dotnet … es-element і в мене запрацювало.

Там можна глянути як я поміняв app.config файл.

Post's attachments

ConsoleApp5.zip 159.62 kb, 411 downloads since 2017-10-03 

Подякували: leofun011

10

Re: Вичитування класів і методів з бібліотеки

Багато часу вже сплило. Довго я колупався з цими бібліотеками і ми (усі колупальники) дійшли наступного висновку, що слеші жодної ролі не відіграють. Бібліотеки, які ми писали самі вичитувались на ура і описані в них методі теж запускались без проблем. Сторонні ж бібліотеки вичитувались уже зовсім по-різному, особливо якщо мова йшла про майкрософтовські бібліотеки: деякі вичитувались лише частково, до інших доступ взагалі був відсутній.
В результаті ми підзабили і змирились.