Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/57: Рейтинг темы: голосов - 57, средняя оценка - 4.89
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
1

Подключение библиотеки

08.11.2010, 13:28. Показов 10393. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите решить проблему с подключением библиотеки.
Нужно подключить библиотеку myDrumlib.dll в программу на c# и выполнить одну функцию. По описанию к библиотеке я предположил, что она написана на с++. Теперь порядок моих действий:
1. в solution explorer выбираю add reference и добавляю dll файл, в коде добавляю using myDrumlib. Теперь если набрать myDrumlib.Drum. среда выводит подсказку какие функции в библиотеке есть. Но при выполнении кода выводится ошибка: "Could not load file or assembly 'myDrumlib.dll' or one of its dependencies.Приложение не было запущено, поскольку оно некорректно настроено. Повторная установка приложения может решить данную проблему. (Exception from HRESULT: 0x800736B1)"."FileLoadException was unhandled"
2. поискал похожие вопросы, решил попробовать импортировать библиотеку:
using System.Runtime.InteropServices;
[DllImport("myDrumlib.dll")]
public static extern bool StartMeasure();
выдает ошибку
"Unable to load DLL 'myDrumlib.dll': Приложение не было запущено, поскольку оно некорректно настроено."."DllNotFoundException was unhandled"
Программирую в c# совсем чуть-чуть, поэтому могу не знать простейших вещей. Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2010, 13:28
Ответы с готовыми решениями:

Подключение библиотеки, написанной на C++
Здравствуйте. Пытаюсь подключить свою dll.dll написанную на С++. Подключаю на C#. Это читал: ...

Ошибка подключение библиотеки
пытаюсь прикрутить monotorrent там один файл .dll бросаю его в корень проекта где все исходники....

Подключение С/С++ библиотеки к проекту на C#
Помогите новичку подключить С/С++ библиотеку к проекту на C# Проблема: - есть DLL написанная на...

Подключение библиотеки dll (c++) к проекту на c#
Как подключить библиотеку dll написанную на c++ к проекту на c#? Добавлено через 5 минут Если...

19
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
08.11.2010, 13:56 2
Когда пишешь DLLImport, библу нужно положить в ту же директорию, где и находится exe файл приложения.
0
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
08.11.2010, 14:07  [ТС] 3
Я знаю, она там и находится, я для надежности записал ее туда, куда только можно, даже в system32.
Не знаю, может быть это поможет решить проблему:
Для работы с этой библиотекой раньше использовалась другая программа, написанная на с++. Пробовал ее запустить на разных компьютерах - запускается, выполняется даже там, где нет .NET framework. А вот на моем при запуске выдает ошибку .NET framework initialization error. unable to find a version of the runtime to run this application. Стоит 4.
Попробовал открыть исходники этой программы и при выполнении он мне опять показал фигу в виде FileLoadException was unhandled. Как я понимаю что-то надо явно переустановить, но что именно?
0
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
08.11.2010, 14:14 4
Добавлено через 51 секунду
Цитата Сообщение от Ranvasrog Посмотреть сообщение
.NET framework initialization error. unable to find a version of the runtime to run this application.
поставь .net frwk
0
61 / 60 / 10
Регистрация: 11.08.2010
Сообщений: 199
08.11.2010, 14:40 5
Ranvasrog, если у вас библиотека написана на С++ (на unmanaged C++, а не С++.NET), то чтобы использовать оттуда какой-нибудь метод:
  1. Этот метод в библиотеке должен быть объявлен в блоке extern "C" с директивой __declspec(dllexport)
    например так:
    C++
    1
    2
    3
    4
    5
    6
    7
    
    extern "C"
    {
         __declspec(dllexport) void SomeMethod(char* arr, int lenght, char entropy)
        {
            //do something
        }
    }
  2. Прототип этого метода на C# должен быть объявлен с атрибутом DllImport и указан правильный прототип метода:
    C#
    1
    2
    3
    4
    
    using System.Runtime.InteropServices;
    ........................................................
    [DllImport("Decoder.dll")]
    public static extern void SomeMethod(byte[] source, Int32 lenght, byte entropy);
  3. Библиотека С++ должна лежать в одной папке c исполняемым файлом C#, референсов через студию добавлять не надо
1
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
08.11.2010, 15:10  [ТС] 6
поставь .net frwk
Стоит 4 .NET frwk.
_Sergei_, я все так и делаю, как вы сказали. Пишет "Unable to load DLL Не найден указанный модуль."
А как узнать, что в библиотеке этот метод объявлен именно так, как вы сказали? И если он так не объявлен я не смогу использовать библиотеку на c#?
0
36 / 36 / 2
Регистрация: 08.11.2010
Сообщений: 119
08.11.2010, 15:12 7
Чтобы использовать функцию, нужно же знать ее сигнатуру и имя!как по-другому то?
0
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
08.11.2010, 15:23  [ТС] 8
LilLoco, сигнатуру функции я знаю. Она есть в сопроводительном файле. Сигнатура, кстати, включает в себя имя
0
61 / 60 / 10
Регистрация: 11.08.2010
Сообщений: 199
08.11.2010, 16:15 9
Ну вот когда я удалил свою библиотеку на С++ из папки где находится исполняемый файл на C# получил ошибку "Unable to load DLL 'Decoder.dll': Не найден указанный модуль. (Exception from HRESULT: 0x8007007E)" Видимо вы все-таки что-то не туда размещаете и приложение не видит библиотеки.
Библиотека должна быть по <путь к проекту>\bin\debug\библиотека.dll (это если у вас debug по умолчанию стоит)
0
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
08.11.2010, 19:10  [ТС] 10
К сожалению, библиотека находится в нужной папке и название я копировал копипастом. Уже всю голову сломал. Подозреваю во всем виной конфликт 4 .Net framework и библиотеки если такое вообще возможно. Завтра попробую поговорить с человеком, который мне это прислал, может что-нибудь проясню
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
08.11.2010, 19:23 11
Ranvasrog, можете DLL выложить?
1
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
08.11.2010, 22:15  [ТС] 12
в ходе тестирования выяснилось, что кривая dll
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
08.11.2010, 22:22 13
Ну Вы бы хоть DLL сюда выложили, а то народ не поймет. Может ещё кто, что-нибудь интересное выскажет
0
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
09.11.2010, 10:11  [ТС] 14
SSTREGG, не, если я ее выложу в общий доступ меня кто-то повесит Еще раз спасибо.
А, чем вы, если не секрет, смотрели начинку dll?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.11.2010, 18:01 15
Рефлектор.
1
19 / 19 / 3
Регистрация: 08.11.2010
Сообщений: 78
12.11.2010, 18:06  [ТС] 16
В общем, наверное, докопался я до сути. Библиотека написана под dotnet. Но для своего правильного функционирования она использует функции и процедуры из другой библиотеки, которая на unmanaged C++. Что можно с этим поделать? Пробую подключить все используемые в ней функции через pinvoke, примерно таким образом:
C#
1
2
3
4
5
6
7
8
9
10
[DllImport("somelibrary.DLL",EntryPoint = "Some_Procedure")]
public static extern System.IntPtr Some_Procedure(
        System.String lpszName, 
        System.UInt32 dwAccess,
    System.UInt32 dwShareMode,
        System.IntPtr lpSecurityAttributes,
    System.UInt32 dwCreate,
    System.UInt32 dwAttrsAndFlags,
        System.IntPtr hTemplate
        );
но эффекту 0
Пока все процедуры неуправляемой библиотеки, которые используются управляемой, я подключил. Структуры пока только не описал. Ошибка до сих пор та же.
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
12.11.2010, 18:32 17
Цитата Сообщение от Ranvasrog Посмотреть сообщение
В общем, наверное, докопался я до сути. Библиотека написана под dotnet. Но для своего правильного функционирования она использует функции и процедуры из другой библиотеки, которая на unmanaged C++. Что можно с этим поделать? Пробую подключить все используемые в ней функции через pinvoke, примерно таким образом:
Если она написана под dotnet, то тогда непонятен зачем вы вообще pinvoke мастрячите? - Она должна подгрузиться как сборка через ReferenceAssembly.
Через pinvoke подключаются только неуправляемые функции....

То что в самой сборке дергаются ф-ии из unmanaged dll означает лишь то, что нужно эту unmanaged dll'ку закинуть в PATH проекта.

Вы вообще определяете, с чем работаете? dll сборка или dll native?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
12.11.2010, 18:45 18
sigmov, основная DLL написана на C++, обертка над ней на C++\CLI.
Цитата Сообщение от sigmov Посмотреть сообщение
Через pinvoke подключаются только неуправляемые функции....
Не соглашусь. В .NET тоже можно экспортировать функции, но конечно не стандартными методами
Ranvasrog, попробуй работать сразу с native dll.
0
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
12.11.2010, 19:12 19
Цитата Сообщение от SSTREGG Посмотреть сообщение
sigmov, основная DLL написана на C++, обертка над ней на C++\CLI.
Понятно. Видимо я это упустил. СПС.
Не соглашусь. В .NET тоже можно экспортировать функции, но конечно не стандартными методами
Знаю. Даже делал это через IL(Кстати весьма интересно, почему же в C# не предусмотрели для этого какого-либо механизма, скажем через атрибут DllExport....) добавлением .export[n]
Но делать для управлемой функции точку входа чтобы использовать ее опять же из NET через PInvoke это юмор чистой пробы ))))
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
12.11.2010, 19:15 20
Цитата Сообщение от sigmov Посмотреть сообщение
Знаю. Даже делал это через IL(Кстати весьма интересно, почему же в C# не предусмотрели для этого какого-либо механизма, скажем через атрибут DllExport....) добавлением .export[n]
Но делать для управлемой функции точку входа чтобы использовать ее опять же из NET через PInvoke это юмор чистой пробы ))))
Согласен
0
12.11.2010, 19:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2010, 19:15
Помогаю со студенческими работами здесь

Подключение внешней библиотеки программно
При подключении библиотеки использую этот код Assembly extLibrary = Assembly.Load(new...

Подключение библиотеки lame_enc.dll
Для очередного моего проекта мне необходимо провести конвертацию по схеме: mp3 -&gt; wav -&gt; mp3 mp3...

Подключение dll библиотеки к стороннему приложению
Добрый день! В общем присутствует некое приложение(исходников от него нету), и к нему нужно...

VK API подключение библиотеки и пример использования
Здравствуйте, скажите, пожалуйста как подключить vk api. Откуда брать библиотеку? Как подключить...


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

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