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