Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
-19 / 1 / 2
Регистрация: 05.11.2012
Сообщений: 48

Передать делегат (заранее неизвестный) в метод

11.12.2013, 18:54. Показов 5179. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сразу к сути: нужно передать делегат (заранее не известный) в нутрь метода для использования - пытаюсь так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public static void NativeDLL<NativeInvoker>(string fname, string pname)
        {
            //  Открываем DLL, получаем ее Handle
            IntPtr hExe = API.LoadLibrary(fname);
            //  Получаем адрес функции, экспортируемой DLL
            IntPtr NativeFunction = API.GetProcAddress(hExe, pname);
 
            //  Используя маршалинг, приводим неуправляемую функцию к делегату
            NativeInvoker nativeInvoker = Marshal.GetDelegateForFunctionPointer(NativeFunction, typeof(NativeInvoker)) as NativeInvoker;
            //  Получаем значение экспортируемой функции, используя объект делегата
            string importedString = nativeInvoker();
 
            //  Освобождаем ресурсы
            API.FreeLibrary(hExe);
        }
получаю это:
C#
1
2
Ошибка    1   Параметр типа "NativeInvoker" не может использоваться с оператором  "as", так как он не имеет ни ограничения класса типа, ни ограничения "class"
Ошибка    2   "nativeInvoker" является "переменная", но используется как "метод"
а так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public static void NativeDLL(string fname, string pname, Type NativeInvoker)
        {
            //  Открываем DLL, получаем ее Handle
            IntPtr hExe = API.LoadLibrary(fname);
            //  Получаем адрес функции, экспортируемой DLL
            IntPtr NativeFunction = API.GetProcAddress(hExe, pname);
 
            //  Используя маршалинг, приводим неуправляемую функцию к делегату
            NativeInvoker nativeInvoker = Marshal.GetDelegateForFunctionPointer(NativeFunction, typeof(NativeInvoker)) as NativeInvoker;
            //  Получаем значение экспортируемой функции, используя объект делегата
            string importedString = nativeInvoker();
 
            //  Освобождаем ресурсы
            API.FreeLibrary(hExe);
        }
это:
C#
1
Ошибка    1   Не удалось найти имя типа или пространства имен "NativeInvoker" (пропущена директива using или ссылка на сборку?)
как же быть ???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2013, 18:54
Ответы с готовыми решениями:

Можно ли как-то "напрямую" передать обобщенный метод в делегат Func
Привет! Есть в Метод1 с параметром типа Func&lt;string, string, IEnumerable&lt;string&gt;&gt;: void MyMethod1(Func&lt;string, string,...

Можно ли унаследовать заранее неизвестный класс?
Всем привет! Помогите, пожалуйста разобраться с наследованием в C++. Я пока новичок, хочу написать нейронную сеть. Столкнулся с...

Как преобразовать объект в заранее неизвестный тип
Что то типо void method(Type T) { List &lt;T&gt; list = new List&lt;T&gt;(); } или

25
12.12.2013, 11:14
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от finflaex Посмотреть сообщение
цитату, ну еще название темы (что не в счет), тема перемещена в раздел для начинающих (я уже не начинающий)
Судя по вашей реакции, вы как раз таки начинающий.

0
-19 / 1 / 2
Регистрация: 05.11.2012
Сообщений: 48
12.12.2013, 18:33  [ТС]
Цитата Сообщение от NickoTin Посмотреть сообщение
private delegate string ToCall ( IntPtr delegateToCall );
это очень неизвестный делегат, и он передается в метод через параметр, а не берется из класса содержащего метод

Добавлено через 51 секунду
Цитата Сообщение от ITL Посмотреть сообщение
Судя по вашей реакции, вы как раз таки начинающий.
судя по вашей поспешности вы как раз таки точно начинающий

Добавлено через 2 минуты
Цитата Сообщение от NickoTin Посмотреть сообщение
NativeDLL<FuncToCallB>( "TestDll.dll", "GetFuncB", qwe );
надо чтобы вызывался
C#
1
NativeDLL<ToCall>( "TestDll.dll", "GetFuncB");
или
C#
1
NativeDLL( "TestDll.dll", "GetFuncB",ToCall);
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
12.12.2013, 20:56
Цитата Сообщение от finflaex Посмотреть сообщение
надо чтобы вызывался
Вы уж определитесь что Вам нужно. Вам предлагаешь, а с каждым предложением вопрос меняется. Я не зря процитировал Ваш пост, т.к. код который я предложил выполняется в точности как написано у Вас.

Цитата Сообщение от finflaex Посмотреть сообщение
C#
1
NativeDLL<ToCall>( "TestDll.dll", "GetFuncB");
или
C#
1
NativeDLL( "TestDll.dll", "GetFuncB",ToCall);
ToCall это как раз делегат для GetFuncB[A], разберитесь пожалуйста с предложенным мною кодом и сформулируйте вопрос более точно, желательно с псевдокодом.

 Комментарий модератора 
Предлагаю всем участникам темы прекратить оффтопить.
А лично Вам, finflaex, перестать огрызаться.
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
13.12.2013, 14:51
Цитата Сообщение от finflaex Посмотреть сообщение
расшифруйте пожалуйста в чем заключается суть его ответа
C#
1
2
string importedString = nativeInvoker(); // было
string importedString = nativeInvoker.Invoke(); // стало
Цитата Сообщение от finflaex Посмотреть сообщение
Ошибка* 1 * "nativeInvoker" является "переменная", но используется как "метод"
Про что и было написано в первом же ответе, который почему-то "спам".
0
-19 / 1 / 2
Регистрация: 05.11.2012
Сообщений: 48
13.12.2013, 22:04  [ТС]
Цитата Сообщение от finflaex Посмотреть сообщение
Передать делегат (заранее неизвестный) в метод
У меня есть длл которая подключается через references
в ней метод должен принимать тип делегата(не объект и не функцию)
(этот тип можно например использовать для загрузки различных методов из динамически подгруженных библиотек)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// project code
delegat string dlg1();
delegat void dlg2(int i);
class zxc
{
     void button_click()
     {
          label1.text = dll.load_method("qwe.dll","asd",dlg1);
          dll.load_method("qwe.dll","zxc",dlg2);
     }
}
// project dll refrences
public object load_method (string file_name, string function_name, Delegate delegat)
{
     ...
     return delegat.run();
}
ситуация натянута и не естественна, зато более понятна в чем заключается цель, весь код образный - не придираться
это проще показать на текущей ситуации, нежели объяснить истинную цель моего проекта
я понимаю что текущую ситуацию можно решить другими путями (и не одним) но мне нужно только передать делегат в метод

Добавлено через 1 минуту
Цитата Сообщение от Qwertiy Посмотреть сообщение
Про что и было написано в первом же ответе, который почему-то "спам".
в заголовке четко указанна цель, да и на первый взгляд код идентичный

Добавлено через 50 секунд
Цитата Сообщение от ITL Посмотреть сообщение
Последний раз редактировалось mik-a-el; 11.12.2013 в 21:22.
да и этого не было в прошлый раз

Добавлено через 2 минуты
Цитата Сообщение от NickoTin Посмотреть сообщение
ToCall это как раз делегат для GetFuncB[A]
так он должен быть неизвестным, а он у вас прописан рядом с методом

Добавлено через 2 минуты
Цитата Сообщение от NickoTin Посмотреть сообщение
а с каждым предложением вопрос меняется
заголовок неизменен, только все по прежнему меня тыкают в динамическую загрузку длл, вот и пытаюсь по разному объяснить одну задачу

Добавлено через 2 минуты
Цитата Сообщение от finflaex Посмотреть сообщение
1
NativeDLL<ToCall>( "TestDll.dll", "GetFuncB");
Цитата Сообщение от finflaex Посмотреть сообщение
1
NativeDLL( "TestDll.dll", "GetFuncB",ToCall);
Цитата Сообщение от NickoTin Посмотреть сообщение
NativeDLL<FuncToCallA>( "TestDll.dll", "GetFuncA", ( ) => Console.WriteLine( "Test" ) );
* * * * * * NativeDLL<FuncToCallB>( "TestDll.dll", "GetFuncB", qwe );
сходство колоссально, вы передаете функцию, я хочу делегат
0
13.12.2013, 22:10

Не по теме:

Цитата Сообщение от finflaex Посмотреть сообщение
да и этого не было в прошлый раз
Это неправда.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.12.2013, 22:10

Как реализовать программу, внедряющуюся извне в заранее неизвестный браузер и манипулирующую его выводом?
А как решить следующую задачу: русский человек открывает английский сайт, а у него эксель открыт в это время, он там нажимает кнопку - а...

Передать делегат с параметрами в аргументы метода
Вообщем нашел способ как вызывать ивенты с любого класса, и что б в подписчике был доступ к любому контролу, даже если ивент вызывал совсем...

Как передать MethodInfo, если нужен делегат
Сабж, у меня есть объект A типа MethodInfo с информацией о функции, которую надо вызывать. Теперь как мне передать А в другой метод,...

Как передать делегат в качестве параметра другому делегату?
Здравствуйте. Хочу написать код, который содержит три делегата: delegate double NormStress(int n, double a); ...

Сколько аргументов требуется передать в делегат в приведенном коде
Код написан на с++/CLR, но отличия от с# минимальны так что думаю всем код понятен. Почему этот код работает? public delegate void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru