Подключение DLL - C# (209468)
Формулировка задачи:
Добрый день или вечер...
1) Есть длл написанная на шарпе
2) Есть проект на шарпе
Нужно: подключить данную длл в проект во время выполнения программы зная только имя длл (константа, но интересен вариант если не константа) и использовать класс из длл
Решение задачи: «Подключение DLL»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Reflection; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { // задаем и инициализируем необходимые переменные // полный путь до длл из которой мы динамически загрузим наш класс string PathToDll = @"c:\Users\fenix\Documents\Visual Studio 2010\Projects\MyBaseDll\MyBaseDll\bin\Debug\MyBaseDll.dll"; // имя класса который мы собираемся загрузить из длл, // !!! ВАЖНО !!! должно включать в себя пространство имен в котором запакован наш класс string ClassNameInDll = "RotorBase.LocalBase"; // имя метода который мы будем использовать и который находится внутри класса который мы динамически загрузим из длл string MethodNameInClassInDll = "Run"; // имя базы данных string DataBaseName = "test.sdf"; // пароль к базе данных string DataBasePassword = ""; // ссылка на объект класса который мы динамически загрузим из длл Object MyBase; // ссылка на метод класса который мы динамически загрузим из длл MethodInfo MyRun; // непосредственно рабочий код // инициализируем ссылки на объект и его метод DinamicLoadClassAndMetodInDll( out MyBase, out MyRun, PathToDll, ClassNameInDll, MethodNameInClassInDll, DataBaseName, DataBasePassword ); // пример использования ссылок CreateTable( MyBase, MyRun ); AddRecord( MyBase, MyRun, 123,321,123.321,321.123 ); GetRecords( MyBase, MyRun, "" ); } /// <summary> /// Отправка SQL запроса на создание таблицы /// </summary> /// <param name="MyBase">ссылка на объект</param> /// <param name="MyRun">ссылка на метод</param> public static void CreateTable(Object MyBase, MethodInfo MyRun) { object[] param = new object[2]; param[0] = "CREATE TABLE [weight](" + "id int NOT NULL IDENTITY (1,1) PRIMARY KEY," + "n1 int NOT NULL," + "n2 int NOT NULL," + "weight float NOT NULL," + "signal float NOT NULL" + ")"; SendSqlCommand( MyBase, MyRun, param ); } /// <summary> /// Отправка SQL запроса на добавление данных в таблицу /// </summary> /// <param name="MyBase">ссылка на объект</param> /// <param name="MyRun">ссылка на метод</param> /// <param name="n1">первый параметр запроса</param> /// <param name="n2">второй параметр запроса</param> /// <param name="weight">третий параметр запроса</param> /// <param name="signal">четвертый параметр запроса</param> public static void AddRecord(Object MyBase, MethodInfo MyRun, int n1, int n2, double weight, double signal) { object[] param = new object[2]; param[0] = string.Format("INSERT INTO [weight] ([n1],[n2],[weight],[signal]) VALUES ('{0}','{1}','{2}','{3}')",n1,n2,weight,signal); SendSqlCommand( MyBase, MyRun, param ); } /// <summary> /// Отправка SQL запроса на порлучение данных из таблицы /// Вывод данных в консоли /// </summary> /// <param name="MyBase">ссылка на объект</param> /// <param name="MyRun">ссылка на метод</param> /// <param name="Cond">Условия отбора данных</param> public static void GetRecords(Object MyBase, MethodInfo MyRun, string Cond) { object[] param = new object[2]; param[0] = "SELECT * FROM [weight]"; if ( Cond != "" ) param[0] += " WHERE " + Cond; SendSqlCommand( MyBase, MyRun, param ); } /// <summary> /// Данный метод динамически загружает из указанной DLL Заранее известный класс, /// выполняет конструктор этого класса с указанными параметрами /// и возвращает ссылку на объект класса и указанный нами метод /// При отсутсвии файла базы данных он создается /// </summary> /// <param name="Base">ссылка на объект</param> /// <param name="Metod">ссылка на метод</param> /// <param name="PathDll">полный путь до DLL</param> /// <param name="ClassName">полное имя класса (включая пространство имен)</param> /// <param name="MetodName">имя метода</param> /// <param name="BaseName">полный путь до файла базы данных</param> /// <param name="BasePassword">пароль к базе данных</param> static void DinamicLoadClassAndMetodInDll(out Object Base, out MethodInfo Metod, string PathDll, string ClassName, string MetodName, string BaseName, string BasePassword) { // загружаем нашу длл Assembly assem = Assembly.LoadFile( PathDll ); // получаем описание нашего класса Type MyType = assem.GetType( ClassName ); // создаем объект нашего класса Base = Activator.CreateInstance( MyType, BaseName, BasePassword ); // получаем описание метода нашего класса Metod = MyType.GetMethod( MetodName ); } /// <summary> /// Этот метод позволяет послать любою строку SQL запроса /// </summary> /// <param name="BaseWorking">База с которой идет работа в данный момент</param> /// <param name="MetodWorking">Метод через который идет пересылка запроса</param> /// <param name="ParamsForMethod">Первый параметр - это строка запроса, второй должен быть либо нулевым либо содержать параметры для запроса (нереализовано)</param> static void SendSqlCommand(object BaseWorking, MethodInfo MetodWorking, object[] ParamsForMethod) { // пример использования нашего метода который содержит класс, который в длл List<List<string>> ResultMetod = ( List<List<string>> )MetodWorking.Invoke( BaseWorking, ParamsForMethod ); if ( ResultMetod != null && ResultMetod.Count > 0 ) { OutResultMetod( ResultMetod ); } } /// <summary> /// Данный метод выводит результаты запроса на консоль /// </summary> /// <param name="arrayStrings">Результаты запроса которые надо вывести</param> static void OutResultMetod(List<List<string>> arrayStrings) { foreach ( List<string> arrayString in arrayStrings ) { foreach ( string stringResult in arrayString ) Console.Write( stringResult + "\t"); Console.Write( "\n" ); } Console.ReadKey(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д