Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 962
1

Как подключить dll, написанные на "чистом" С++?

19.06.2014, 09:23. Показов 1482. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Написал программу обработки изображений на C# (VS2010, .Net2). Программа, как и следовало ожидать, скоростью не отличается. Поэтому наиболее важные участки кода решено переписать на С++ и вынести отдельно (скорее всего в dll). Скажите, а VS2010 для С++ компилирует программу в нативный код или тоже в управляемый? Где можно посмотреть, как подключить dll, написанные на "чистом" С++. Понимаю, что есть интернет и товарищ гугл, но если можно, поделитесь ссылкой на хорошие тутор и пример.

Добавлено через 4 минуты
Вот сейчас начал делать в VS2010 проект "MFC DLL". Скажите, это то что нужно, или есть другие шаблоны?

Добавлено через 5 минут
Будет ли он вызываться из C#?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2014, 09:23
Ответы с готовыми решениями:

Как вызывать библиотеки dll, написанные на C#
Библиотека, которая мне нужна содержит класс формы окна, которое мне хотелось бы использовать в...

Awesomium - для C++ Builder, или Как в Билдере использовать DLL, написанные в MSVC, если coff2omf не помогает
Потребовалось разработать приложение типа "браузер" на C++ Builder, что я делаю нечасто, потому что...

Как при создании своей dll подключить туда сторонние dll
Здравствуйте, я работаю в связке C# - Oracle. Если коротко, то вопрос звучит так: "Как при создании...

Как подключить dll (SmartCOM3.dll) к php через расширение php_com_dotnet?
Доброе время суток. Передо мной встала задача через php подцепить SmartCOM3.dll. В мануале...

11
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
19.06.2014, 10:09 2
Небольшой, но вполне понятный пример...

Добавлено через 5 минут
Ну и у Microsoft в MSDN, конечно же завалялся пример.
1
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
19.06.2014, 10:41 3
Khludenkov, постой, не спеши, get\set Pixel используешь на шарпе?
0
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 962
19.06.2014, 10:51  [ТС] 4
Раньше dll не приходилось заниматься, теперь навёрстываю...
А скажите, большие массивы данных (кадры видео) между основной программой на C# и на dll С++ как лучше передавать? Через указатели, сериализацию в память?

Добавлено через 1 минуту
Цитата Сообщение от UnsKneD Посмотреть сообщение
Khludenkov, постой, не спеши, get\set Pixel используешь на шарпе?
Да, приходится. Проект достался для переделки. На С# с использованием DirectShow. Надо подправить и ускорить.

Добавлено через 58 секунд
Есть и прамой доступ к указателям, с использованием fixed, но как-то не то...

Добавлено через 2 минуты
Не получается создать dll файл. VS2010 пишет
C++
1
file corrupt
...
0
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
19.06.2014, 10:52 5
Khludenkov,

в разы быстрее работает чем setPixel, да и на плюсах я не помню такой скорости.
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
37
38
39
40
41
42
43
44
45
        public static void MakeGray(Bitmap bmp)
        {
            // Задаём формат Пикселя.
            PixelFormat pxf = PixelFormat.Format24bppRgb;
 
            // Получаем данные картинки.
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            //Блокируем набор данных изображения в памяти
            BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);
 
            // Получаем адрес первой линии.
            IntPtr ptr = bmpData.Scan0;
 
            // Задаём массив из Byte и помещаем в него надор данных.
            // int numBytes = bmp.Width * bmp.Height * 3; 
            //На 3 умножаем - поскольку RGB цвет кодируется 3-мя байтами
            //Либо используем вместо Width - Stride
            int numBytes = bmpData.Stride * bmp.Height;
            int widthBytes = bmpData.Stride;
            byte[] rgbValues = new byte[numBytes];
 
            // Копируем значения в массив.
            Marshal.Copy(ptr, rgbValues, 0, numBytes);
 
            // Перебираем пикселы по 3 байта на каждый и меняем значения
            for (int counter = 0; counter < rgbValues.Length; counter += 3)
            {
 
                int value = rgbValues[counter] + rgbValues[counter + 1] + rgbValues[counter + 2];
                byte color_b = 0;
 
                color_b = Convert.ToByte(value / 3);
 
 
                rgbValues[counter] = color_b;
                rgbValues[counter + 1] = color_b;
                rgbValues[counter + 2] = color_b;
 
            }
            // Копируем набор данных обратно в изображение
            Marshal.Copy(rgbValues, 0, ptr, numBytes);
 
            // Разблокируем набор данных изображения в памяти.
            bmp.UnlockBits(bmpData);
        }
С координатами возня конечно, но можно перенести всё в матрицу.
0
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 962
19.06.2014, 11:09  [ТС] 6
Надо попробовать. Да, надо подучить матчасть...

Добавлено через 10 минут
Цитата Сообщение от UnsKneD Посмотреть сообщение
в разы быстрее работает
А может ещё примерчик быстрого перемножения дух матриц подскажите?
0
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2014, 06:37 7
Цитата Сообщение от Khludenkov Посмотреть сообщение
А может ещё примерчик быстрого перемножения дух матриц подскажите?
C#
1
2
using System.Threading;
using System.Threading.Tasks;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            
            int[][] C = new int[1000][];
            for (int i = 0; i < 1000; i++)
            {
                C[i] = new int[1000];
            }
 
            Parallel.For(0, 1000, (i) =>
            {
                
                for (int j = 0; j < 1000; j++)
                {
                    C[i][j] = 0;
                    for (int k = 0; k < 1000; k++)
                    {
                        C[i][j] += A[i][k] * B[k][j];
                    }
                }
            });
Если только так, 18 секунд, против 32 без Parallel

Добавлено через 14 минут
Можно ещё попробовать использовать foreach.
1
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 962
20.06.2014, 08:54  [ТС] 8
Спасибо, учу матчасть (Шилдта).
0
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2014, 18:48 9
Khludenkov, пользы от шилда маловато будет он совсем для чайников пишет, воды много, читай ещё msdn и тут на форуме, про Marshal например закреплено вверху этой ветки.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.06.2014, 03:13 10
Khludenkov, https://www.cyberforum.ru/csha... 42135.html
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
21.06.2014, 05:05 11
Цитата Сообщение от Khludenkov Посмотреть сообщение
А может ещё примерчик быстрого перемножения дух матриц подскажите?
Решение СЛАУ методом ГАУССА - тут есть. На C#. Работает не медленнее чем на С++ (тестировал).

Не по теме:

Помню в свое время сам болел производительностью - делал ASM вставки в С++, в C# делал вкрапления неуправляемого кода..... Как показало время - был не прав. Овчинка выделки не стоит.

1
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 962
21.06.2014, 08:59  [ТС] 12
!!!!

Сделал native Dll вызываемую из C#.
Подскажите, а сам вызов dll таким способом сильно накладный для программы?
Можно ли в таком случае передавать массивы (размером ~10кБ) через указатели?

Добавлено через 10 минут
Да, попробую и на С#. Там тоже все эти fixed и lock. Пока не разобрался, когда из надо ставить, когда не надо.
0
21.06.2014, 08:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2014, 08:59
Помогаю со студенческими работами здесь

Как подключить свою dll к другой DLL (не своей) с проверкой?
Привет всем. Не знаю куда написать, напишу сюда. Вопрос такой: хочу подключить свою dll к другому...

Как подключить ssleay32.dll & libeay32.dll
Всем привет. У меня QT5 Собран статически, но без openssl. Как мне сейчас можно поступить, что бы...

Как подключить dll sln во внутрь одной dll?
хай. У меня есть библиотека dll (главная) в которой я использовал другие, чтобы запустить...

Как подключить dll, написанную на C, к dll на Delphi
Добрый день! Нужно подключить dll написанную на C к dll на Delphi. Как это можно сделать и можно ли...

Как подключить dll на C# к проекту (dll) на С++
Подскажите, пожалуйста, как подключить dll на C# к проекту (dll) на С++. В интернете много...

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


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

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