Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка плагинов из сети, как реализовать ? 
:(
    Опции темы
asper
Дата 12.8.2005, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 10.8.2005

Репутация: нет
Всего: нет



А можно реализовать такую фичу - основная программа находится у пользователя, а плагины подгружаются через локальную сеть с сервера? Если да, то как примерно это выглядит, что для этого нужно и где об этом можно почитать?
Еще раз спасибо за терпение и ответы smile
PM MAIL   Вверх
arilou
Дата 12.8.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Можно поступить хитро ;)

Создаешь обработчики событий AppDomain.TypeResolve, AppDomain.AssemblyResolve

Код

using System.Reflection;

class App
{
private static Assembly downloadMyAssembly(object sender, ResolveEventArgs e)
{
    // здесь вставляешь код, который скачивает сборку по имени, которое 
    // передается в e.Name
    // кладешь код в byte[] assemblyCode;

    // вызываешь метод Assembly.Load(byte[] rawAssembly)
    return Assembly.Load(assemblyCode);
}

private static Assembly lookupType(object sender, ResolveEventArgs e)
{
    // выделяешь название сборки из имени типа, которое 
    // передается в e.Name
    string[] parts = e.Name.Split(','); // название сборки - второе по счету

    // а теперь возвращаешь сборку по имени
    // если она не будет найдена локально, произойдет вызов первого метода
    return Assembly.LoadWithPartialName(parts[1]);    
}

static void Main(string[] args)
{
    // подписываешься на события
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(downloadMyAssembly);
    AppDomain.CurrentDomain.TypeResolve += new ResolveEventHandler(lookupType);

    // и теперь пытаешь создать экземпляр типа MyPlugin, который реализует интерфейс
    // IPlugin, и находится в сборке App.Plugins.dll. Эту сборку ты хочешь залить по сети

    IPlugin plg = (IPlugin)Activator.CreateInstance(Type.GetType("MyApp.Plugins.MyPlugin,App.Plugins"));
}



Рекомендую почитать в MSDN про Reflection.

Это сообщение отредактировал(а) arilou - 12.8.2005, 14:41


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
asper
Дата 15.8.2005, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 10.8.2005

Репутация: нет
Всего: нет



ага... спасибо большое!
буду разбираться
а как насчет трафика? - много скушает такое сооружение? сеть не встанет?
PM MAIL   Вверх
mr.DUDA
Дата 15.8.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(asper @ 15.8.2005, 10:18)
а как насчет трафика? - много скушает такое сооружение? сеть не встанет?

Если не будешь грузить плагины повторно каждый раз, то много не скушает. Сеть точно не ляжет, т.к. длл-ки в .NET очень лёгкие по размерам: самая жирная длл-ка может занять не более полутора мегабайт, а в среднем выходит по 90-150 килобайт, в зависимости от содержимого.


--------------------
user posted image
PM MAIL WWW   Вверх
asper
Дата 16.8.2005, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 10.8.2005

Репутация: нет
Всего: нет



а еще... можно приведеный выше код увидеть в варианте vb.net smile
PM MAIL   Вверх
arilou
Дата 16.8.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



FYI, для .NET'чика надо уметь читать и писать на обоих языках smile

Код

imports System.Reflection

class App

private shared function downloadMyAssembly(sender as object, e as ResolveEventArgs) as [Assembly] 
    ' здесь вставляешь код, который скачивает сборку по имени, которое 
    ' передается в e.Name
    ' кладешь код в byte() assemblyCode

    ' вызываешь метод Assembly.Load(byte[] rawAssembly)
    return [Assembly].Load(assemblyCode)
end function

private shared function lookupType(sender as object, e as ResolveEventArgs) as [Assembly] 
    ' выделяешь название сборки из имени типа, которое 
    ' передается в e.Name
    Dim parts as string() = e.Name.Split(",") ' название сборки - второе по счету

    ' а теперь возвращаешь сборку по имени
    ' если она не будет найдена локально, произойдет вызов первого метода
    return [Assembly].LoadWithPartialName(parts[1])
end function

shared sub Main(args() as string)
    ' подписываешься на события
    AddHandler AppDomain.CurrentDomain.AssemblyResolve, addressof downloadMyAssembly
    AddHandler AppDomain.CurrentDomain.TypeResolve, addressof lookupType

    ' и теперь пытаешь создать экземпляр типа MyPlugin, который реализует интерфейс
    ' IPlugin, и находится в сборке App.Plugins.dll. Эту сборку ты хочешь залить по сети

    IPlugin plg = Activator.CreateInstance(Type.GetType("MyApp.Plugins.MyPlugin,App.Plugins"))
end sub

end class


Это сообщение отредактировал(а) arilou - 16.8.2005, 14:56


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 16.8.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(asper @ 16.8.2005, 03:43)
а еще... можно приведеный выше код увидеть в варианте vb.net


З.Ы. поставить себе .NET Reflector, скомпилить C#-овский пример в длл-ку и раскомпилить из неё в VB.NET-исходник, всего-то делов.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.