MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Разбор dll и добавление их в программу"
Answer 795275
По сути, вопрос состоит из двух частей: как работать с ресурсами сборки, и как динамически работать с типами. Для решения данных задач используются классы
System.Reflection.Assembly
иSystem.Activator
. Следующий упрощенный пример демонстрирует это.Создадим тестовый проект библиотеки классов
ResTestDLL
, содержащий текстовый файлfile.txt
, отмеченный как внедренный ресурс, и класс:using System; using System.Collections.Generic; using System.Text; namespace ResTestDLL { public class Cat { public override string ToString() { return "I am cat"; } } }
Создадим приложение:
using System; using System.IO; using System.Collections.Generic; using System.Reflection; using System.Text; namespace ResTest { class Program { static void Main(string[] args) { /**** Демонстрация загрузки ресурса *****/ //путь к DLL string path = Path.Combine(Environment.CurrentDirectory, "ResTestDLL.dll"); //имя ресурса: складывается из имени сборки и имени файла string resname = "ResTestDLL.file.txt"; Assembly ass = Assembly.LoadFile(path);//загружаем DLL string[] names = ass.GetManifestResourceNames();//получаем все ресурсы if (names.Length == 0) { Console.WriteLine("Ошибка: В сборке нет ресурсов"); Console.ReadKey(); return; } foreach (string name in names) { if (name == resname) //находим нужный ресурс { //открываем поток для чтения данных Stream s = ass.GetManifestResourceStream(name); StreamReader read = new StreamReader(s); using (read) { //выводим содержимое ресурса Console.WriteLine(read.ReadToEnd()); } break; } } /**** Демонстрация динамической работы с типами *****/ string classname = "Cat"; //имя класса, который мы будем создавать string method = "ToString"; //имя вызываемого метода var types = ass.GetTypes(); //получаем все классы в сборке foreach (var type in types) { if (type.Name == classname)//находим нужный тип { object o = Activator.CreateInstance(type);//создаем экземпляр MethodInfo mi = type.GetMethod(method); string res = (string)mi.Invoke( //вызываем метод o, //ссылка на экземпляр new object[0] //массив аргументов ); Console.WriteLine("Результат вызова метода: " + res); break; } } Console.ReadKey(); } } }
Cкомпилируем его, и поместим
DLL
в один каталог сEXE
. Приложение должно вывести текст из файлаfile.txt
и результат вызова метода.Примечание. Если ресурс добавляется не как элемент проекта, а через вкладку "Ресурсы" в свойствах проекта, все будет несколько сложнее: придется использовать класс ResourceReader и вытаскивать ресурсы из
dictionary
.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.