Я просто получил исходный код третьей стороны, и это в основном проект оболочки другой библиотеки 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)
Когда я сказал им, что это то, что происходит, они сказали мне, что он динамически загружен. Я что-то пропустил?
Список ссылок содержит только другие сборки.NET, которые ссылаются на ваши программы и использует их или COM-объекты, но любой неуправляемый код, который вы вызываете, хотя DllImport
никогда не указан. Как говорит продавец, он динамически загружается по требованию и не подразумевает ссылку на компиляцию, поэтому вы ее не видите.
Но это не означает, что вам не нужен сам.DLL во время выполнения. Файл должен быть доступен в тот момент, когда ваша программа совершает первый вызов функции P/Invoke'd. Посмотрите, откуда у вас источник, они должны предоставить эту стороннюю библиотеку (иначе код бесполезен). Типичная практика заключается в том, чтобы объединить библиотеки DLL вместе с основным.EXE, чтобы система могла легко найти их.
Если вы добавите DLL в проект (а не как ссылку, а как "существующий файл"), вы можете Copy always
установить Copy to output directory
в " Copy always
чтобы всегда иметь его в компиляции.