Подключение 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();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.375 из 5
Похожие ответы