Тема: Вичитування класів і методів з бібліотеки
Привіт, форумчани. Є наступне завдання (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("");
}
}
}
}