|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
|||||||||||
Исполнение функций подгружаемых во время исполнения программы из сторонних хранилищ22.08.2016, 11:05. Показов 2473. Ответов 23
Метки нет (Все метки)
День добрый, отзывчивые, знающие, смекалистые.
Не знаю как чётко сформулировать вопрос, поэтому опишу как смогу, надеюсь поймёте.(Опытным программистам к таким постановкам проблем не привыкать )Язык C#. Предположим что есть программа, которая по своей сути является оболочкой без особого функционала, но с пользовательским интерфесом (форма с полями ввода и кнопками). И вот эта программа, должна смотреть в определённом месте все файлы нами заданного типа. (пофиг каком, пусть папка с именем LibSrc которая рядом с экзешником самой программы лежит). Файлы эти по своей "структуре" однотипные, но по содержанию разные. Содержат эти файлы только функции. Причём функции только типа
Программа же должна по желанию пользователся должна выдать список всех доступных функций из этих файлов и иметь возможность запускать выбранную пользователем из этого списка функцию с параметрами (котоыре все вида byte[][] args) Собственно вопрос, какой сущьностью должны быть эти файлы с функциями? Библиотеками, сериализованными экземплярами класса или ещё чемто? И собственно как это должно работать? Писать код не прошу(хотя и приветствую) но меня больше интересует сам подход и общая идея. Варианты подходаЖ: Была идея сделать эти файлы в виде DLL, но собственно как работать с данной конкретной библиотекой остаётся непонятным - самой программе же чтбы подгрузить библиотеку и воспользоваться функциями из неё нужно же знать имена этих функций, не так ли? Можно конечно в каждую такую длл ку засунуть функцию типа
public delegate bool DelegateMy(ref byte[][] args, ref String ReturnNameThisFuntion); Тоесть в каждой библиотеке есть функция с одним и темже именем которая возвращает лист с указателем на все её функции. Но я не уверен что такое вобще реализуемо, не пробовал, просто мысль. Другая идея это каждый такой вот файл будет не DLL а сохраненный сериализованный класс(экземпляр?!), который является наследником от некоторого класса, который позволил бы организовать взаимодействие программы с нашей программой, но в каждом таком классе переопределены функции и их коичество(!), однако количество функций указано в виде константного поля. Ваши коментарии, пожалуйста. Добавлено через 2 минуты Вы хоть маякните если "что автор хотел то вобще?! он сам то понял? я нет!"
0
|
|||||||||||
| 22.08.2016, 11:05 | |
|
Ответы с готовыми решениями:
23
Объединить вместе несколько сторонних облачных хранилищ Ошибки во время исполнения программы
|
|
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
|
||||||||||||
| 22.08.2016, 12:13 | ||||||||||||
Сообщение было отмечено JustOneQuestion как решение
Решение
Здравствуйте!
Загрузить сборку можно при помощи методов Assembly.Load*. Список доступных функций можно получить перечислив все типы в загруженной сборке, а затем получив методы типов.
Вызов методов можно осуществить с использованием функции MethodInfo.Invoke. Если методы не статические, то для вызова потребуется создать экземпляр типа, в котором находится метод. Сделать это можно возпользовавшись функционалом класса Activator. Пример:
Другой решения - компиляция кода на лету будет значительно сложней в реализации и поддержке.
1
|
||||||||||||
|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
|||||||||||
| 22.08.2016, 15:40 [ТС] | |||||||||||
|
golubyatnikovtv, спасибо за совет, пробую сделать как вы предложили.
Пара вопросов появилась 1.
2.
Вы предложили отфильтровать по сигнатуре. Вот тут вот чёт даже идей нет как это сделать. Не подскажите? 3. Это всё работает на XP? А так конечно да... впечетляет...
0
|
|||||||||||
|
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
|
||||||||||
| 22.08.2016, 16:01 | ||||||||||
|
Проверить на анонимность можно так http://stackoverflow.com/a/2483054
1) MethodInfo.ReturnType == typeof(bool) 2) MethodInfo.GetParameters().Length == 2 Если этого будет не достаточно то также нужно проверить сами параметры получаемые функцией GetParameters() Под .NET Framework 4.0 должно все работать.
1
|
||||||||||
|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
||
| 22.08.2016, 16:26 [ТС] | ||
|
А, ну хорошо. Через MethodInfo.GetParameters() идея понятна, можно и так. Я просто думал что есть какоето волшебный лямбда код в одну строчку и какойнить способ выкинуть из листа всё что неудоволетворяет определнёным требованиям, которые собственно в лямда коде бы и были указаны. В таком варианте это была бы одна строка. Но это не критично )
Если они будут статическими, то какие варианты вызова могут быть и что предпочтительнее?
0
|
||
|
|
|
| 22.08.2016, 16:28 | |
|
JustOneQuestion, C# .Net + WindowsForms + плагины
0
|
|
|
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
|
||||
| 22.08.2016, 16:31 | ||||
|
0
|
||||
|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
||||||||||||
| 23.08.2016, 13:03 [ТС] | ||||||||||||
|
golubyatnikovtv, Rius спасибо за советы.
Я вот не пойму а как сделать в
К Activator.CreateInstance тот же вопрос.
0
|
||||||||||||
|
|
||
| 23.08.2016, 13:33 | ||
|
0
|
||
|
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
|
|||||
| 23.08.2016, 13:53 | |||||
|
"Тот же вопрос" мне не понятен применительно к активатору. Добавлено через 15 минут
0
|
|||||
|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
|
| 23.08.2016, 16:37 [ТС] | |
|
Спасибо всем за советы, Если четсно не понял в чём же сложность рефлексии, подскажите где ждать подвоха.
Спасибо, с ref разобрался. Вроде принцип работы с вытаскиванием функций из DLL понятен ... в общих чертах. Дальше посмотрим. Есть ещё один вопрос в моём сознании. Наврено его сформулировать можно так: Можно ли "скопировать" метод вытащенный из DLL и вставить его в мной созданный некий класс так, чтобы после одноразовой загрузки DLL, вытаскивания из неё метода, можно было забыть про DLL и больше с ней не взаимодействовать. А метод при этом уже будет методом уже моего какогото класса и чтобы его выполнить я буду обращаться к нему через экземпляр класса.
0
|
|
|
|
|
| 23.08.2016, 17:16 | |
|
JustOneQuestion, она не сложная и без подвоха.
Зато она излишняя и слишком подробная. Вам придётся описывать все мелочи на низком уровне. Это трудозатратно, муторно, долго. В отличие от этого, можно той же рефлексией вытащить из библиотеки один заранее известный интерфейс и вызывать всевозможные функции уже через него. Это будет намного проще.
0
|
|
|
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
|
|
| 23.08.2016, 18:05 | |
|
не туда
0
|
|
|
186 / 184 / 97
Регистрация: 30.04.2016
Сообщений: 478
|
||
| 23.08.2016, 19:56 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
||
| 23.08.2016, 20:30 [ТС] | ||
0
|
||
|
|
|
| 23.08.2016, 20:34 | |
|
JustOneQuestion, да возможно, конечно. Декомпилировать нужную сборку на IL, вытащить исходники, переработать и собрать в своей программе. Только вот этот Ад ни к чему.
Здесь загружается сборка. Из неё вытаскивается объект. Ссылка на него сохраняется в классе-обёртке. Этот класс предоставляет наружу функции. При вызове этих функций, вызовы переадресовываются в класс, загруженный из сборки. Не создавайте себе проблемы.
0
|
|
|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
||||||
| 23.08.2016, 22:12 [ТС] | ||||||
|
Вот рабочий код.
2 класса + Main. Первый класс (OutSideF) читает DLL, вытаскивает методы и составляет список делегатов на эти методы. Второй класс (OtherClass) берёт список делегатов и сохраняет у себя. В Main создаётся экземпляр "читателя DLL", после чего экземпляр OtherClass заберает у него список делегатов. А "читатель" уничтножается. Писалось это с интересом проверить чё будет то. Можно ли методы засунусть в список делегатов и можно ли их передавать, а первоисточник уничтожить. Оказалось можно вроде. ведь код работает, и я теперь несовсем понимаю почему. Что ж тогда такое делегат и где на самом деле хранится код тех методов что были вытащены из DLL.
0
|
||||||
|
|
||
| 23.08.2016, 22:22 | ||
|
Вы занулили ссылку, но перед этим вы передали эту ссылку в два объекта. Таким образом, в них эта ссылка есть (ее копия), и сам объект, на который она указывает, никуда не делся, он жив-здоров.
0
|
||
|
1 / 1 / 0
Регистрация: 01.05.2015
Сообщений: 84
|
||||||
| 23.08.2016, 22:41 [ТС] | ||||||
|
Э, так а где тогда хранятся то сами методы? в том экземпляре который я пытался удалить? Казалось бы я сохранил ссылки только на методы которые MethTmp.Invoke. А что с остальными полявми и методами экземпляра класса, они тоже живы или нет? На них то вроде уже нет ссылок.
И кстати ещё один забавный момент. Если сделать ещё один ReadKey перед TestDlg1.Execute(0, ref Params);
0
|
||||||
| 23.08.2016, 22:41 | |
|
Помогаю со студенческими работами здесь
20
Определение функции во время исполнения программы Создание объектов во время исполнения программы Оценить время исполнения программы, собственные команды
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|