• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

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

  • Автор темы evg2108
  • Дата начала
E

evg2108

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

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

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

evg2108

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

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

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

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

-master-

Well-known member
14.01.2012
616
12
#6
Ну без проекта сложно что-то сказатью Если платформы не совпадают, то да пишет что не найдена длл.
А вот при совпадении платформ все ок, по крайней мере у нас так работает, без каких либо спец. телодвижений.
 
E

evg2108

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

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

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

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

Код:
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;
}
 
E

evg2108

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

Guest

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

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

Помогите пожалуйста, я уже не знаю что делать...
Скачайте авто инсталлер !
 
E

evg2108

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

Свойства проекта -> Свойства конфигурации -> Общие -> Использование MFC