Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.05.2012
Сообщений: 20
1

Динамическое подключение dll, method not found

23.05.2012, 16:41. Показов 2893. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Первый раз у вас на форуме, так что извиняюсь если что не так оформлю
В общем, Ошибка: "method 'Testlibra.Class1.Init' not found"
Подключаю библиотеку
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using ModuleDelegate;
 
namespace ModuleDelegate
{
    public delegate void CallBackDelegate(object[] args);
}
namespace TestLibra
{
    public class Class1
    {        
        public string Init(ModuleDelegate.CallBackDelegate dcallback)
        {
            object[] args = { "Hello" };
            dcallback(args);
            return "ok";
        }
 
        public delegate void CallBackDelegate(string msg);
    }
}
Вызов библиотеки :

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private bool loadDLL(string name)
        {
            bool res = false;
            try
            {
                Assembly extAssemblyFile = Assembly.LoadFile("C:/Users/Hesayhello/Documents/Visual Studio 2010/Projects/Deep/Deep/TestLibra.dll");
 
                Type ExtAssemblyType = extAssemblyFile.GetType("TestLibra.Class1");
 
                object ExtAssembly = Activator.CreateInstance(ExtAssemblyType);
 
                CallBackDelegate dcallback = new CallBackDelegate(this.DLLCallback);
                object[] args = { dcallback };
                res = (bool)ExtAssemblyType.InvokeMember("Init", BindingFlags.DeclaredOnly | BindingFlags.Public  | BindingFlags.Instance | BindingFlags.SetProperty, null, ExtAssembly, args);
            }
            catch (Exception ex)
            {
                string message = ex.Message;
                if (ex.InnerException != null)
                    message += Environment.NewLine + ex.InnerException.Message;
 
                MessageBox.Show(message);
            }
            return res;
 
        }
Вроде все делал по подобию [ссылка на форум]
но что то не так
Огромная просьба, объясните, что не так
Мне нужно просто подключить библиотеку, чтоб она вернула какое то значение...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2012, 16:41
Ответы с готовыми решениями:

Динамическое подключение DLL, которая в свою очередь использует другие DLL
Здравствуйте! Направьте на путь истинный, как поступить след. образом: Пишу небольшое...

Динамическое подключение DLL
Здравствуйте! Скорее всего, мой вопрос покажется вам глупым, но всё же... Я не могу динамически...

Динамическое подключение DLL
Здравствуйте! Обращаюсь за помощью к знающим людям! Объясните пожалуйста как динамически...

Динамическое подключение dll
Здравствуйте! Обращаюсь за помощью к знающим людям! Объясните пожалуйста как динамически...

9
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
23.05.2012, 16:46 2
DLL подключение
вызов твоей функции из библиотеки:
C#
1
Testlibra.Class1.Init()
0
0 / 0 / 0
Регистрация: 22.05.2012
Сообщений: 20
23.05.2012, 16:58  [ТС] 3
Мне нужно именно динамически
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
23.05.2012, 18:53 4
Так, а откуда вы при вызове знаете о типе CallBackDelegate? То есть вы её подключили напрямую, но вызывать все равно хотите динамически?
0
0 / 0 / 0
Регистрация: 22.05.2012
Сообщений: 20
23.05.2012, 19:05  [ТС] 5
Разумеется пробовал
Ошибка-"method 'Testlibra.Class1.Init' not found"
на строке 15 в вызове библиотеки.

Добавлено через 8 минут
Я не знаю... Делал по примеру просто.
а вызывать нужно динамически, потому что их должно быть несколько, и с выбором местоположения...
Но это потом, в идеале
0
0 / 0 / 0
Регистрация: 22.05.2012
Сообщений: 20
25.05.2012, 17:55  [ТС] 6
Люди, ну всего одна ошибка, помогите пожалуйста

Добавлено через 20 часов 33 минуты
Если не объявлять тип res, то нет этой ошибки...
Как тогда получить значение из этой библиотеки?

Добавлено через 2 часа 11 минут
Вроде получилось, но...
C#
1
2
3
4
5
6
7
foreach (Type t in asm.GetTypes())
            {                
                    object obj = Activator.CreateInstance(t);
                    res = t.InvokeMember("Init", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); // Exception is risen from here     
           //тут можно использовать res
            }
//тут нельзя, ибо "не присвоено значение"
в чем проблема?
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
25.05.2012, 19:20 7
Компилятор видит, что res может не получить значение, так как asm.GetTypes() может вернуть пустую коллекцию.
Инициализируйте res null`ом например, чтобы успокоить компилятор.
1
0 / 0 / 0
Регистрация: 22.05.2012
Сообщений: 20
31.05.2012, 09:46  [ТС] 8
С предыдущим разобрался, проблем нет.
Теперь хочу вызвать форму, содержащуюся в той же библиотеке.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Assembly asm = Assembly.LoadFile(filenamepath);
            foreach (Type t in asm.GetTypes())
            {
                if (t.FullName == "TestLibra.Class1")
                {
                    object obj = Activator.CreateInstance(t);
                    res = t.InvokeMember("Init", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); 
                }
                if (t.FullName == "TestLibra.Form1")
                {
                    object obj = Activator.CreateInstance(t);
                    frminit = t.InvokeMember("Form1", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null);
                }
Как то так
Проверка "if (t.FullName ==" чтоб не ругался, что не может найти "Init" в Form1.cs
но дальше не вызывает
C#
1
2
3
4
5
6
public class Class1
    {
        public static string Init()
        {            
            return "string";
        }
C#
1
2
3
4
5
6
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
В чем дело хотя бы? В различии описания классов, или в том что форма не возвращает ничего

Добавлено через 1 час 9 минут
Еще попробовал через
C#
1
2
3
4
5
6
if (t.FullName == "TestLibra.Form1")
                {
                    MethodInfo meth = t.GetMethod("Form1", new Type[] { }, null); 
                    Object instance = Activator.CreateInstance(t);
                    meth.Invoke(instance, null);                     
                }
Но на последнюю строку ругается- "Object reference not set to an instance of an object."

Может я форму неправильно добавляю? Я ее тупо через "добавить форму" к классу, из которого компилировал dll. и хочу вызвать для начала пустую, а там разберусь
0
0 / 0 / 0
Регистрация: 22.05.2012
Сообщений: 20
01.06.2012, 17:08  [ТС] 9
Решение:
C#
1
2
3
4
5
6
if (t.FullName == "TestLibra.Form1")
                {
                    Object instance = Activator.CreateInstance(t); // Создание объекта полученного типа
                    MethodInfo meth = t.GetMethod("Show", new Type[] { }, null); 
                    meth.Invoke(instance, null);
                }
Нашел похожее в другой теме
Спасибо, Turbanoff
0
0 / 0 / 0
Регистрация: 22.05.2012
Сообщений: 20
06.06.2012, 13:41  [ТС] 10
Хм, теперь возник такой вопрос:
Как передать всю информацию об объекте на форме из dll в саму программу?
Например, есть DataGridView1 на форме в dll и на форме в в проге, вызывающей эту dll.
и мне нужно перенести все значения ячеек из DGV1 на форме в основную(с названиями строк и столбцов)
просто численные значения например, у меня получилось перенести с помощью матрицы, но как быть со строками и столбцами?
Еще два строковых массива? должен же быть путь полегче.
0
06.06.2012, 13:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2012, 13:41
Помогаю со студенческими работами здесь

Динамическое подключение DLL
Здравствуйте. Проблема такова: надо написать функцию, принимающую на вход имя библиотеки и имя...

dll динамическое подключение
Задача вот какая, нужно подключить длл но динамически if fileexist('mydll') then connect else ...

DLL, динамическое подключение
Пишу прогу используя winapi. Нужно из DLL загрузить динамически функцию, которая в переданный...

Динамическое подключение dll
Требуется динамически подключить dll. Вызвать из неё форму, а после завершения работы формы из dll...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru