|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Загрузка и выгрузка сборок - пичальбеда |
|
.NET - Загрузка и выгрузка сборок - пичальбеда
|
Новый участник Сообщения: 21 |
Задача такая: надо реализовать библиотеку, управляющую загрузкой и выгрузкой сборок. Причем выгрузка должна быть. То есть Assembly->LoadFrom не прокатит. хотя ранее вполне себе хватало такого подхода. Сейчас, по всей видимости, софтина будет расти постоянно - виды учета будут добавляться к ней как плагины. Плюс отчетность. то есть, в перспективе, всяко может быть. Надо обеспечить выгрузку плагинов при необходимости. Вариант с Assembly->LoadFrom эту проблему не решает, т. к. сборки остаются в главном домене. В нете куча примеров решения моего вопроса, но ни один не работает. Попервой пробовал загружать сборку через AppDomain::Load. Все прекрасно грузится, когда сборка лежит рядом с экзешником и грузится в главный домен, а не тот, из которого гружу ее. Когда сборка лежит где-то в другом месте, получаю ошибку, что, мол, не найдена она. Попробовал так:
По логике, я внутри созданного мной домена (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 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Установка - Извлечение ПО из сборок :) | 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 |
|