Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Загрузка и выгрузка сборок - пичальбеда

Ответить
Настройки темы
.NET - Загрузка и выгрузка сборок - пичальбеда

Аватара для Verholom

Новый участник


Сообщения: 21
Благодарности: 2

Профиль | Отправить PM | Цитировать


Задача такая: надо реализовать библиотеку, управляющую загрузкой и выгрузкой сборок. Причем выгрузка должна быть. То есть Assembly->LoadFrom не прокатит. хотя ранее вполне себе хватало такого подхода. Сейчас, по всей видимости, софтина будет расти постоянно - виды учета будут добавляться к ней как плагины. Плюс отчетность. то есть, в перспективе, всяко может быть. Надо обеспечить выгрузку плагинов при необходимости. Вариант с Assembly->LoadFrom эту проблему не решает, т. к. сборки остаются в главном домене. В нете куча примеров решения моего вопроса, но ни один не работает. Попервой пробовал загружать сборку через AppDomain::Load. Все прекрасно грузится, когда сборка лежит рядом с экзешником и грузится в главный домен, а не тот, из которого гружу ее. Когда сборка лежит где-то в другом месте, получаю ошибку, что, мол, не найдена она. Попробовал так:

Код: Выделить весь код
this._app.DoCallBack(()=>System.Reflection.Assembly.LoadFrom(strFileName));
По логике, я внутри созданного мной домена (this._app) вызываю загрузку нужной сборки. Но получаю ошибку:

System.Runtime.Serialization.SerializationException: Тип "pluginlib.PluginManager+<>c__DisplayClass2" сборки "pluginlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" не помечен как сериализуемый.
в System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
в pluginlib.PluginManager.LoadFile(String strFileName) в f:\1032\dev\pluginlib\pluginlib\PluginManager.cs:строка 83

pluginlib - это библиотека, которая будет управлять загрузкой и выгрузкой сборок. PluginManager - класс, который это делает. Но в объявлении класса стоит атрибут [Serializable]... Сперва подумал, что проблема в том, что сборка, которую загружаю, не содержит такой пометки класса. Ан нет...

Вот полностью код конструктора класса, где создается домен:

Код: Выделить весь код
public PluginManager(string strPath)
{
this._Path = strPath;

//чисто ради уникальности имени домена
string strDomainName = "Domain"+System.Math.Abs(System.DateTime.Now.ToBinary()).ToString();

AppDomainSetup appds=new AppDomainSetup();
appds.ApplicationBase=this._Path;
appds.ApplicationName = strDomainName;

this._app = AppDomain.CreateDomain(strDomainName, null, appds);
}
А вот - код загрузки сьборки по полному (с путем) имени файла:

Код: Выделить весь код
public IEnumerable<IPlugin> LoadFile(string strFileName)
{
List<IPlugin> lstPluginTypes=new List<IPlugin>();
System.Type plgType = typeof(IPlugin);

System.Reflection.Assembly asm;
try
{
//в коментариях - варианты, испробованные ранее

//Сборка не найдена
//asm = this._app.Load(System.Reflection.AssemblyName.GetAssemblyName(strFileName));

//ошибка поиска класса
//pluginlib.IPlugin ip = (IPlugin)((this._app.CreateInstance(System.Reflection.AssemblyName.GetAssemblyName(strFileName).ToString(), "testplugin")).Unwrap());

//this не помечен как сериализуемый
this._app.DoCallBack(()=>System.Reflection.Assembly.LoadFrom(strFileName));


}
catch(Exception e){
Console.WriteLine(e.ToString());

return null;
}


Тут тип возврата такой - каждая сборка может иметь несколько классов, реализующих нужный интерфейс.

IPlugin - простой инетрфейс с одним методом, который будет реализовывать каждая сборка

Затык пока только на загрузке файла сборки

Отправлено: 11:04, 14-04-2014

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Загрузка и выгрузка сборок - пичальбеда

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Установка - Извлечение ПО из сборок :) bziki.t4 Microsoft Windows 7 1 17-09-2012 22:53
VBS/WSH/JS - [решено] Загрузка/выгрузка из/в *.txt файл HFShak Скриптовые языки администрирования Windows 5 20-01-2012 16:56
MSFT SQL Server - Выгрузка базы в текстовый файл и загрузка обратно xoxmodav Программирование и базы данных 4 17-11-2010 01:11
Выборочная загрузка и выгрузка данных из формы в таблицу MySQL dima1981 Вебмастеру 8 25-08-2008 18:02
Драйвер - Загрузка и выгрузка dll через CMDline borison Microsoft Windows 2000/XP 2 29-02-2008 17:50




 
Переход