Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13

[WPF] Подключение dll (ffmpeg)

30.06.2017, 16:38. Показов 4413. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вижуха 17. Проект WPF C#.
Столкнулся с проблемой подключения ffmpeg к проекту.
Либы не получается подключить т.к для #pragma разрешены только checksum и warning.
Подключаю using System.Runtime.InteropServices; для [DllImport("avcodec-57.dll")], а он выдает ошибку "не допускается для этого типа объявления. ..."
В ссылки не добавляются .dll, выдавая ошибку "Не удается добавить ссылку на ... . Убедитесь, что файл доступен, и является допустимой сборкой или компонентом СОМ.".
Потратил несколько часов на поиск в инете за зря.
Во вложении либы,хедеры,библиотеки, пикча с ошибкой.
dll.part1.rar
dll.part2.rar
include.rar
lib.rar
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.06.2017, 16:38
Ответы с готовыми решениями:

Подключение dll в WPF
Всем здравствуйте, у меня такой вопрос, как подключить библиотеку dll в WPF, и как ее инициализировать в коде?

Упаковать dll внутрь WPF приложения
Приветствую товарищи! в wpf новичок, и уже два дня ломаю голову и гугл поиском решения. :cry: Как же можно запеч внешние...

Как зашить dll в exe? (wpf)
Всем привет! Собственно в чем проблема. Подключил к проекту свою библиотеку. Программа маленькая и надо что бы на выходе был один exe...

15
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
30.06.2017, 16:42
Вы что серьёзно собирались использовать в шарпе директивы плюсов?
Зачем тогда using, сразу бы иклудили сборки, что такого...
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
30.06.2017, 16:53  [ТС]
Заместо колких высказываний правильный ответ подошел бы лучше
0
Эксперт .NET
 Аватар для Wolfdp
3784 / 1760 / 371
Регистрация: 15.06.2012
Сообщений: 6,533
Записей в блоге: 3
30.06.2017, 17:04
если нужен просто конвертер, есть решение в виде NReco.VideoConverter, подключается через nuget
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
30.06.2017, 17:05
Цитата Сообщение от neokms Посмотреть сообщение
Потратил несколько часов на поиск в инете за зря.
Чё даже на официальный репозиторий не попал?
https://github.com/Microsoft/FFmpegInterop

там в samples всё есть. Тебе нужны примеры для cs.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
30.06.2017, 18:31  [ТС]
Чё даже на официальный репозиторий не попал?
https://github.com/Microsoft/FFmpegInterop

там в samples всё есть. Тебе нужны примеры для cs.
Заглядывал, там, как я понял, библиотеки подключены ссылками, что у меня не получается сделать.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
30.06.2017, 18:41  [ТС]
Такие дела
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 04:21  [ТС]
Вопрос все еще остается открытым.
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
01.07.2017, 04:32
neokms, библиотеки, что вы хотите подключить, видимо являются неуправляемыми (написаны на Си или С++), что делает невозможным их подключение к проекту. Для работы с кодом на Си из C# используйте p\invoke (гугл и учебник по C# в помощь).
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 12:14  [ТС]
neokms, библиотеки, что вы хотите подключить, видимо являются неуправляемыми (написаны на Си или С++), что делает невозможным их подключение к проекту. Для работы с кодом на Си из C# используйте p\invoke (гугл и учебник по C# в помощь).
Да яж говорил что не работает все это
Кто-нибудь может дать внятное решение данной проблемы?
Либо кто-нибудь обоснует, что не возможно подключить ffmpeg к c# (а это не так).
0
22 / 21 / 11
Регистрация: 13.11.2016
Сообщений: 75
01.07.2017, 14:58
Неуправляемую библиотеку я бы подключал примерно так:
Создал бы класс в проекте БлаблаблаWrapprer далее в нём сделал бы следующее:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        #region Импорт dll
        [DllImport("kernel32.dll")]
        private static extern IntPtr LoadLibrary(string path);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Init();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Close();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int IsAlive();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void RegisterEventHandler(OnKeyDownCallbackDelegate dk, OnDeviceStateChangedCallbackDelegate ds);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommand(byte c1, byte c2);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommandBlocking(byte c1, byte c2);
        #endregion
Далее в конструкторе или инициализаторе класса:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public БлфблаWrapper()
{
                #region Загрузка dll
                string path = string.Format("{0}\\{1}\\{2}",
                                                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                                Environment.Is64BitProcess ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                IntPtr.Size == 8 ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                "OptimusMini.dll");
 
                IntPtr ptr = LoadLibrary(path);
 
                if (ptr == IntPtr.Zero)
                {
                    throw new Win32Exception(string.Format("Не удалось загрузить библиотеку OptimusMini.dll"));  
                }
                #endregion
}
Если бы длл не загружалась бы - то попробовал бы поменять параметр CallingConvention.Cdecl при импорте методов.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 15:11  [ТС]
Цитата Сообщение от Padmasambhava Посмотреть сообщение
Неуправляемую библиотеку я бы подключал примерно так:
Создал бы класс в проекте БлаблаблаWrapprer далее в нём сделал бы следующее:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        #region Импорт dll
        [DllImport("kernel32.dll")]
        private static extern IntPtr LoadLibrary(string path);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Init();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void Close();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int IsAlive();
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void RegisterEventHandler(OnKeyDownCallbackDelegate dk, OnDeviceStateChangedCallbackDelegate ds);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommand(byte c1, byte c2);
 
        [DllImport("OptimusMini.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int SendCommandBlocking(byte c1, byte c2);
        #endregion
Далее в конструкторе или инициализаторе класса:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public БлфблаWrapper()
{
                #region Загрузка dll
                string path = string.Format("{0}\\{1}\\{2}",
                                                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                                Environment.Is64BitProcess ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                IntPtr.Size == 8 ? "x64" : "x86", // Если две дллки под 32 и под 64 разряда
                                                "OptimusMini.dll");
 
                IntPtr ptr = LoadLibrary(path);
 
                if (ptr == IntPtr.Zero)
                {
                    throw new Win32Exception(string.Format("Не удалось загрузить библиотеку OptimusMini.dll"));  
                }
                #endregion
}
Если бы длл не загружалась бы - то попробовал бы поменять параметр CallingConvention.Cdecl при импорте методов.
Да, делал я так. Он ругается при объявлении методов на аргументы. Без ссылки на длл не хочет их принимать, а ссылки не добавляются т.к ошибка.
В твоем примере тоже самое "OnKeyDownCallbackDelegate" и "OnDeviceStateChangedCallbackDelegat e" не распознает.
Я в шапке оставил исходники. Если тебе удастся подключить их так, что бы все работало на c# wpf, я тебе хоть сотку дам.
0
22 / 21 / 11
Регистрация: 13.11.2016
Сообщений: 75
01.07.2017, 15:30
Естественно имена и сигнатуры у Вас будут другие, но LoadLibrary точно так же как здесь и ни каких ссылок на сбори не нужно только убедитесь что Ваши длл находятся либо в каталоге запускаемого приложения либо в системных каталогах.

Добавлено через 4 минуты
Правильно ругается таких типов со звёздочками в шарпе не бывает - имя на экземпляр ссылочного класса и так - ссылка на кучу.

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

Добавлено через 7 минут
Извини но я не буду сейчас этим заниматься даже за сотку баксов. У меня свой проект есть над которым я работаю. Постарайтесь разобраться самостоятельно. На картинке в шапке он ругается потому что Вы импортируете не в статическом классе это значит что нужно не в майнвиндов это делать, а создать другой класс - обёртку со спецификатором static.
0
0 / 0 / 0
Регистрация: 17.10.2016
Сообщений: 13
01.07.2017, 15:43  [ТС]
Цитата Сообщение от Padmasambhava Посмотреть сообщение
Естественно имена и сигнатуры у Вас будут другие, но LoadLibrary точно так же как здесь и ни каких ссылок на сбори не нужно только убедитесь что Ваши длл находятся либо в каталоге запускаемого приложения либо в системных каталогах.

Добавлено через 4 минуты
Правильно ругается таких типов со звёздочками в шарпе не бывает - имя на экземпляр ссылочного класса и так - ссылка на кучу.

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

Добавлено через 7 минут
Извини но я не буду сейчас этим заниматься даже за сотку баксов. У меня свой проект есть над которым я работаю. Постарайтесь разобраться самостоятельно. На картинке в шапке он ругается потому что Вы импортируете не в статическом классе это значит что нужно не в майнвиндов это делать, а создать другой класс - обёртку со спецификатором static.
Даже при условии создания статик-класса не помогало.
Пишет, что не может найти те типы данных, что описаны в длл. Все длл распиханы во все щели...
Тут либо я тупой либо лыжи не едут. Хотя, выше кидали ссылку на гит с сборкой на впф c#, где все работает, но описания подключения там нет(хотя я уверен там юзаются ссылки, что не работают у меня)
0
22 / 21 / 11
Регистрация: 13.11.2016
Сообщений: 75
01.07.2017, 15:59
Цитата Сообщение от neokms Посмотреть сообщение
В твоем примере тоже самое "OnKeyDownCallbackDelegate" и "OnDeviceStateChangedCallbackDelegat e" не распознает.
Я в шапке оставил исходники. Если тебе удастся подключить их так, что бы все работало на c# wpf, я тебе хоть сотку дам.
В моём случае это делегаты объявленные чуть выше так:

C#
1
2
3
4
5
6
7
8
9
10
        #region Закрытые делегаты и их обработчики
        // Библиотека предоставляет данные делегаты. Здесь они закрытые
        // чтобы пользователь не работал напрямую с ними, а вешал свои
        // обработчики на публикуемые события
        private delegate void OnKeyDownCallbackDelegate(int key);
        private delegate void OnDeviceStateChangedCallbackDelegate(int state);
 
        private static OnKeyDownCallbackDelegate OnKeyDown;
        private static OnDeviceStateChangedCallbackDelegate OnDeviceStateChanged;
        #endregion
И поэтому в моём случае они приемлемого для с# типа, а не Сиплюсплюсные указатели и указатели на указатели как у Вас.

Добавлено через 6 минут
Цитата Сообщение от neokms Посмотреть сообщение
Даже при условии создания статик-класса не помогало.
Пишет, что не может найти те типы данных, что описаны в длл. Все длл распиханы во все щели...
Тут либо я тупой либо лыжи не едут. Хотя, выше кидали ссылку на гит с сборкой на впф c#, где все работает, но описания подключения там нет(хотя я уверен там юзаются ссылки, что не работают у меня)
При импорте нужно указать другие типы - не char* а char или char[], про остальные сказать не могу нужно смотреть библиотеку, а у меня и так пять проектов отрыто в VS - не до скачиваний сейчас.

Добавлено через 1 минуту
Ваши типы при импорте замените соответствующими типами из c# - на худой конец попробуйте object
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
02.07.2017, 05:39
Цитата Сообщение от neokms Посмотреть сообщение
Да яж говорил что не работает все это
Кто-нибудь может дать внятное решение данной проблемы?
Либо кто-нибудь обоснует, что не возможно подключить ffmpeg к c# (а это не так).
Во-первых, я русским языком объяснил, что есть управляемые сборки (которые подключаются ссылками), а есть неуправляемые (которые подключаются через P/invoke). ffmpeg - набор кодеков на Си, значит речь о неуправляемых сборках. Или работайте с ними напрямую через p/invoke (DllImport - это оно), либо ищите какую-нибудь interop-сборку.

Во-вторых, если у вас не получается, то это не значит, что вам посоветовали фигню. Судя по скриншотам с обшибками, вы едва ли понимаете, что делаете от слова совсем. Соответственно, единственный способ вам помочь - отправить читать про p/invoke в частности и про C# в целом, ибо вы явно не отличаете С# от C++.

Всё, обосновывать тут нечего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2017, 05:39
Помогаю со студенческими работами здесь

Подключение OpenGL к WPF
Как подключить OpenGL к проекту C# WPF, используя NuGet?

Подключение шрифта в WPF
Добрый день. Подскажите пожалуйста как можно подключить свои шрифты в проест. В статье "Встраивание шрифтов"...

Can't load extension C:\php/ffmpeg.dll
Здравствуйте. Устанавливаю ffmpeg на сервер IIS+php. скачал архив ffmpeg-php-win32-all.zip Распаковал его. Библиотеку php_ffmpeg.dll...

Подключение библиотеки ffmpeg к проекту
Здравствуйте. Я начал разбираться с библиотекой ffmpeg. Но не пойму как ее можно подключить к проекту в С++ и можно ее подключить и...

Подключение ffmpeg к visual studio 2008
Пытаюсь подключить ffmpeg к Visual C++ по этому гайду После ввода "./configure --toolchain=msvc" вылетает ошибка: c99wrap cl is unable...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru