Проблемы С Подключением Библиотеки Dll

Тема в разделе ".NET - Общие вопросы по языкам", создана пользователем evg2108, 15 окт 2012.

  1. evg2108

    evg2108 Гость

    Проблема заключается в следующем. Есть большой проект на C# - служба Windows. Этот проект использует сторонние нативные библиотеки (dll): Firebird со своей дотнетовской обёрткой, FFmpeg с самописной дотнетовской обёрткой. Все эти библиотечки 32х разрядные, то есть заточены под работу на x86. Но в то же время они нормально работают и на x64.

    Далее, пишу на плюсах свою dll библиотечку (MFC), в которой есть несколько экспортируемых функций. Компилируется под x86. Подключается к проекту (проект отдельный от тех к которым подключены вышеописанные сторонние библиотечки) с помощью DllImport. Проект собирается и запускается под x86 нормально, а под x64 пишет что не удаётся загрузить библиотеку (типа Unable to load DLL 'xxxxx.dll': Не найден указанный модуль).
    Скажите пожалуйста, если кто знает, в чём проблема и как решить её. Может нужны какие-то специфические настройки копилятора?

    Помогите пожалуйста, я уже не знаю что делать...
     
  2. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Platform Target в настройках какие указаны?
     
  3. evg2108

    evg2108 Гость

    В проекте в котором подключается нативная библиотека стоит AnyCPU. В запускаемом проекте стоит x86.
     
  4. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Выставите x86 у обоих.
     
  5. evg2108

    evg2108 Гость

    Пробовал уже, не помогает. Вот прямо сейчас на всякий случай попробовал ещё раз - ноль эффекта. При этом у тех проектов которые подключают сторонние нативные dll`ки в целевой платформе так же стоит AnyCPU, но в отличие от моей dll`ки функции из них вызываются нормально.

    При этом в диспетчере задач видно что служба работает в режиме эмуляции: имя_службы.exe*32

    и ладно бы оно везде не работало, так на x86 операционке работает нормально

    что же я не правильно делаю...
     
  6. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Ну без проекта сложно что-то сказатью Если платформы не совпадают, то да пишет что не найдена длл.
    А вот при совпадении платформ все ок, по крайней мере у нас так работает, без каких либо спец. телодвижений.
     
  7. evg2108

    evg2108 Гость

    Если знаете, скажите пожалуйста, какие есть специальные телодвижения, чтобы наконец заработало. Я открыт для любых идей так как над этой проблемой уже неделю бьюсь... Может что-то надо делать в плюсовом коде или настройках его проекта?

    Могу показать как я делаю:

    в коде c++ проекта объявлена функция

    Код (C++):
    extern "C" int __stdcall GetHValue( __in char* contractorId, __in byte* returnValue){ ... }
    как видно из заголовка функции первый параметр принимает строку, а во второй параметр возвращается байтовый массив. Сама функция возвращает число байт в выходном параметре
    в def-файле указано

    Код (Text):
    LIBRARY

    EXPORTS
    GetHValue
    в коде C# эта функция подключена вот так:

    Код (C++):
    [DllImport("Native.dll", EntryPoint="GetHValue", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
    private static extern int GetHValue(string contractorId, IntPtr bufferPtr);
    этот метод вызывается вот так:

    Код (C++):
            [HandleProcessCorruptedStateExceptions]
    public static byte[] GetHValueWrapper(string contractorId)
    {
    IntPtr bufferPtr = Marshal.AllocHGlobal(1024);
    try
    {
    int length = GetHValue(contractorId, bufferPtr);
    if (length > 0)
    {
    byte[] buffer = new byte[length];
    Marshal.Copy(bufferPtr, buffer, 0, length);
    return buffer;
    }
    }
    catch (ThreadAbortException) { }
    catch (Exception exception)
    {
    throw new GetHValueException(exception is AccessViolationException ?
    new EnvironmentNativeInternalException("AccessViolationException", exception.Message) : exception);
    }
    finally
    {
    if (bufferPtr != IntPtr.Zero)
    try
    {
    Marshal.FreeHGlobal(bufferPtr);
    }
    catch { }
    }
    return null;
    }
     
  8. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Так а какая длл не находится, сборка c# или Native.dll?
     
  9. evg2108

    evg2108 Гость

    Native.dll
     
  10. evg2108

    evg2108 Гость

    Кажется разобрался в чём дело. Точнее не в чём дело, а как сделать чтобы библиотечка подключалась. Пока не уверен до конца в успехе так как проверил всего один раз, а другая возможность проверить появится только завтра. Если всё подтвердится то напишу как получилось решить проблему.
     
  11. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    С путями у вас все в порядке?
     
  12. evg2108

    evg2108 Гость

    С путями всё нормально
     
  13. Гость

    Скачайте авто инсталлер !
     
  14. evg2108

    evg2108 Гость

    Что это и как оно мне поможет?
     
  15. evg2108

    evg2108 Гость

    Короче, надо было просто включить статическую линковку MFC:

    Свойства проекта -> Свойства конфигурации -> Общие -> Использование MFC
     
Загрузка...
Похожие Темы - Проблемы Подключением Библиотеки
  1. aliaksandr89
    Ответов:
    3
    Просмотров:
    129
  2. Amfion
    Ответов:
    5
    Просмотров:
    124
  3. wowa
    Ответов:
    7
    Просмотров:
    381
  4. John_Tavarez
    Ответов:
    0
    Просмотров:
    339
  5. Валентин Амбер
    Ответов:
    11
    Просмотров:
    347

Поделиться этой страницей