Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
1

Обратиться к методу библиотеки DLL

04.10.2018, 01:36. Просмотров 1542. Ответов 26
Метки нет (Все метки)

Здравствуйте.
Имеется библиотека DLL, построенная в MATLAB. Данная библиотека содержит один метод с двумя параметрами.
Если добавить данную библиотеку к проекту в папку Debug, то все работает отлично. Но мне необходимо, чтобы исполняемый .exe файл работал автономно (то есть можно было бы открыть на любом компьютере и использовать полностью функционал программы).
Такие действия сделаны:
C#
1
2
3
4
5
public FormMain()
        {
            InitializeComponent();
            AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            //Получаем текущую сборку которая выполняется(чтобы из нее брать ресурсы)
            Assembly thisAssembly = Assembly.GetExecutingAssembly();
            //Формируем имя ресурса
            var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
            //Находим ресурс по имени
            var resourceName = thisAssembly.GetManifestResourceNames().First(s => s.EndsWith(name));
 
            using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
            {
                //Считываем ресурс в массив байтов
                byte[] block = new byte[stream.Length];
                stream.Read(block, 0, block.Length);
                //Загружаем сборку из массива байтов в текущий домен приложения и возвращаем её
                return Assembly.Load(block);
            }
        }
Осталось написать код, который был бы в обработчике события "button_Cllick". В данном обработчике инициализируются два параметра. Пусть, для простоты:
C#
1
2
var a = 5;
var b =7;
И затем эти два параметра должны передаваться методу библиотеки.
То есть, как обратиться к методу моей библиотеки и передать в него два параметра?
Спасибо.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2018, 01:36
Ответы с готовыми решениями:

Обратиться к методу проекта через DLL
Здравствуйте! При написании кода возникла такая проблема: Описание: Есть исполняемый файл (.EXE)...

Обратиться к методу
Ребят создал программку для выявления макс и мин из 4-ех чисел,но не могу обратиться к...

Обратиться к методу находящемуся в UserControl
К примеру в форме есть кнопка "Рассчитать" при её нажатии нужно обратится к методу Raschet1...

Как обратиться к методу из другого класса
Доброго времени суток. Продолжаю изучение C#, и вот я с вопросом. Имеются 2 класса в отдельных...

26
Nord790
Строитель
734 / 460 / 145
Регистрация: 01.04.2014
Сообщений: 481
Записей в блоге: 4
04.10.2018, 05:47 2
C#
1
2
3
4
5
6
7
8
9
var res = System.Reflection.Assembly.GetExecutingAssembly ().GetManifestResourceStream("Project.Test.dll");
byte[] bytes = new byte[res.Length];
res.Read ( bytes, 0, bytes.Length );
var assembly = System.Reflection.Assembly.Load ( bytes );
dynamic app = assembly.CreateInstance ( "Test.App" );
int a = 5;
int b = 5;
int rslt = app.sum (a, b);
Console.WriteLine ( rslt );
0
OwenGlendower
Супер-модератор
Эксперт .NET
11560 / 9738 / 4077
Регистрация: 17.03.2014
Сообщений: 19,408
Записей в блоге: 1
Завершенные тесты: 2
04.10.2018, 12:20 3
Цитата Сообщение от Alex7676 Посмотреть сообщение
То есть, как обратиться к методу моей библиотеки и передать в него два параметра?
Точно так же и раньше когда DLL лежала рядом с программой. На этпа разработки добавляем ссылку на сборку, помещаем ее в ресурсы и после компиляции пользуемся одним exe файлом.

Код обработчика ResolveAssembly лучше немного изменить чтобы приложение на падало с непонятным исключением
C#
1
2
3
//Находим ресурс по имени
var resourceName = thisAssembly.GetManifestResourceNames().FirstOrDefault(s => s.EndsWith(name));
if (resourceName == null) return null;
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 12:29  [ТС] 4
Nord790, это применить в коде Assembly ResolveAssembly(object sender, ResolveEventArgs args) или в коде обработчика события button_Click?

Добавлено через 1 минуту
OwenGlendower, через using добавляем ссылку на сборку? Не получилось так...
0
OwenGlendower
Супер-модератор
Эксперт .NET
11560 / 9738 / 4077
Регистрация: 17.03.2014
Сообщений: 19,408
Записей в блоге: 1
Завершенные тесты: 2
04.10.2018, 12:37 5
Alex7676, using это не добавление ссылки, а только указание пространства имен чтобы типы из него можно было использовать без указания полного имени. Ссылка добавляется через узел References в проекте. И по идее она у вас уже должна быть раз код работает в ситуации когда DLL лежит рядом с exe.
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 12:39  [ТС] 6
OwenGlendower, а, да, так и сделано. Только без .dll файлов в папке Debug не работает.

Добавлено через 51 секунду
OwenGlendower, необходимо использовать код Nord790?
0
OwenGlendower
Супер-модератор
Эксперт .NET
11560 / 9738 / 4077
Регистрация: 17.03.2014
Сообщений: 19,408
Записей в блоге: 1
Завершенные тесты: 2
04.10.2018, 12:57 7
Alex7676, а в ресурсы DLL уже добавлена? Твой код же из ресурсов загружает ее.
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 13:07  [ТС] 8
OwenGlendower, да, библиотека добавлена в References, в Resources. Ранее я объявлял следующим образом:
C#
1
2
3
4
//Создание объекта класса, созданного на стадии создания библиотеки MATLABAmplitudeSpectrum
                AmplitudeSpectrumClass objectClass = new AmplitudeSpectrumClass();
                //Вызов пользовательской функции MATLAB
                objectClass.AmplitudeSpectrum(_file1, _file2);
0
OwenGlendower
Супер-модератор
Эксперт .NET
11560 / 9738 / 4077
Регистрация: 17.03.2014
Сообщений: 19,408
Записей в блоге: 1
Завершенные тесты: 2
04.10.2018, 13:21 9
Alex7676, проверяйте значит как работает код метода ResolveAssembly. Возможно он не находит ресурс по указанному имени. Нужно или испарвить код формирования имени ресурса или правильно добавить DLL в ресурсы. Код из первого сообщения будет работать только если файл добавлен как embedded resource.
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 13:34  [ТС] 10
OwenGlendower, я таким же образом сделал добавление .txt файла. Он работает. А пользовательские библиотеки - не работают.
0
V_Monomax
1405 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,321
Записей в блоге: 1
Завершенные тесты: 1
04.10.2018, 13:51 11
Alex7676, возможно, библиотека требует установленного MatLab?
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 13:52  [ТС] 12
V_Monomax, возможно. Но у меня на компьютере он установлен и если делать вызов через создание нового класса, то все работает.
0
V_Monomax
1405 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,321
Записей в блоге: 1
Завершенные тесты: 1
04.10.2018, 13:56 13
Цитата Сообщение от Alex7676 Посмотреть сообщение
он установлен
а на других компьютерах он установлен?
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 15:26  [ТС] 14
V_Monomax, конечно нет. Просто я для себя для понимания делаю.
Сейчас вот такое исключение в этой строке выскочило:
C#
1
2
dynamic app = assembly.CreateInstance("Test.App");
                app.AmplitudeSpectrum(_file1, _file2);
Необработанное исключение типа "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException" в System.Core.dll

Дополнительные сведения: Не удается выполнить привязки исполняющей среды по нулевой ссылке

Что вместо "Test.App" я должен был написать?

Добавлено через 1 час 27 минут
V_Monomax, название библиотеки или чего-то еще?
0
SeIZVeIZ
900 / 787 / 327
Регистрация: 08.02.2014
Сообщений: 2,384
Завершенные тесты: 3
04.10.2018, 15:43 15
Цитата Сообщение от Alex7676 Посмотреть сообщение
Что вместо "Test.App" я должен был написать?
[пространство имён].[Имя класса] экземпляр которого нужно создать
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 15:53  [ТС] 16
SeIZVeIZ, не получается В переменной app значение null.
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 15:56  [ТС] 17
SeIZVeIZ, вот если из Debug библиотеку подключаю, то такой класс:
Обратиться к методу библиотеки DLL

То есть я должен прописать:
C#
1
dynamic app = assembly.CreateInstance("MATLABAmplitudeSpectrum.AmplitudeSpectrumClass");
0
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 15:57  [ТС] 18
Но в итоге в переменной app получается null.
0
Nord790
Строитель
734 / 460 / 145
Регистрация: 01.04.2014
Сообщений: 481
Записей в блоге: 4
04.10.2018, 20:00 19
Библиотека:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Test
{
    public class Math
    {
        public int Sum ( int a, int b )
            => a + b;
    }
}
Программа:
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
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Project
{
    public partial class MainWindow : Form
    {
        dynamic Math = null;
        public MainWindow ()
        {
            InitializeComponent ();
            byte[] rawAssembly = new byte[] { };
            using ( var stream = System.Reflection.Assembly.GetExecutingAssembly ().GetManifestResourceStream ( "Project.Test.dll" ) )
            {
                rawAssembly = new byte[stream.Length];
                stream.Read ( rawAssembly, 0, rawAssembly.Length );
            }
 
            var assembly = System.Reflection.Assembly.Load(rawAssembly);
            Math = assembly.CreateInstance ( "Test.Math" );
            
        }
 
        private void MainWindow_Load ( object sender, EventArgs e )
        {
            MessageBox.Show ( Math?.Sum ( 2, 2 ).ToString () );
        }
    }
}
1
Вложения
Тип файла: rar Project.rar (51.5 Кб, 1 просмотров)
Alex7676
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 415
04.10.2018, 20:21  [ТС] 20
Nord790, спасибо за ответ! Но, к сожалению, он не помог. Видимо, с MATLAB - файлами дела обстоят иначе.
0
04.10.2018, 20:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2018, 20:21

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

Обратиться к другому классу и методу несколько раз
Всем привет. Подскажите пожалуйста, как правильно поступить с такой задачей. В результате...

Как обратиться к методу из другого метода внутри одного и того же класса
Доброго времени суток. Продолжаю изучение C#, и вот моя третья тема (или четвертая, за сегодня) с...

Создание dll библиотеки в C#. Вызов классов этой библиотеки
мне нужно как то создать динамическую библиотеку класов в си шарп, основой этой библиотеки должен...

Как использовать методы библиотеки DLL, и игнорировать их, когда DLL нету?
Как использовать методы библиотеки DLL , и игнорировать их когда DLL нету Что нужно , мне нужно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.