Я не вижу Dll в ссылках, которые используются в DLLImport

0

Я просто получил исходный код третьей стороны, и это в основном проект оболочки другой библиотеки c++:

Я вижу, что код выглядит следующим образом:

[DllImport("QMSL_MSVC10D.dll", SetLastError = true, CallingConvention=CallingConvention.Cdecl)]
        static extern byte QLIB_SendSync( uint hResourceContext, 
                short requestSize,
                byte [] requestBytes,
                ref short responseSize,
                byte [] responseBytes,
                ulong timeout       
                );

Самое смешное, что я не вижу "QMSL_MSVC10D.dll" в папке с ссылками. Они сказали, что динамически загружены, но я не вижу QMSL_MSVC10D.dll в любой папке или списке ссылок. Когда я отлаживаю код, он выдает ошибку с ошибкой:

Unable to load DLL 'QMSL_MSVC10D.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

Когда я сказал им, что это то, что происходит, они сказали мне, что он динамически загружен. Я что-то пропустил?

  • 2
    На неуправляемые библиотеки DLL нет необходимости ссылаться в проекте, но они должны быть доступны во время выполнения, включая время отладки.
  • 0
    Что означает, что он должен присутствовать в папке проекта где-нибудь, правильно?
Показать ещё 2 комментария
Теги:
dll
pinvoke
dllimport

1 ответ

1
Лучший ответ

Список ссылок содержит только другие сборки.NET, которые ссылаются на ваши программы и использует их или COM-объекты, но любой неуправляемый код, который вы вызываете, хотя DllImport никогда не указан. Как говорит продавец, он динамически загружается по требованию и не подразумевает ссылку на компиляцию, поэтому вы ее не видите.

Но это не означает, что вам не нужен сам.DLL во время выполнения. Файл должен быть доступен в тот момент, когда ваша программа совершает первый вызов функции P/Invoke'd. Посмотрите, откуда у вас источник, они должны предоставить эту стороннюю библиотеку (иначе код бесполезен). Типичная практика заключается в том, чтобы объединить библиотеки DLL вместе с основным.EXE, чтобы система могла легко найти их.

Если вы добавите DLL в проект (а не как ссылку, а как "существующий файл"), вы можете Copy always установить Copy to output directory в " Copy always чтобы всегда иметь его в компиляции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню