Использование DllImport для загрузки неуправляемых DLL в управляемое приложение

В моем проекте у меня есть неуправляемый родной C ++ dll и приложение C #. Я пытаюсь импортировать функцию из неуправляемой библиотеки DLL, используя DllImport, но я получаю исключение DllNotFoundException.

Вот мой код, который вызывает DLL.

using System.Runtime.InteropServices;
namespace TestApp
{
public delegate void UpdateDelegate(string s);
class Program
{
[DllImport("CGPUnmanagedLibrary.dll")]
internal static extern int parse_raw_gsod_file(
[MarshalAs(UnmanagedType.LPStr)]
string filePath,
int minTemp,
UpdateDelegate callBack);

static void Main(string[] args)
{
UpdateDelegate myCallBack = new UpdateDelegate(Program.Report);
string path = @"C:\Creative Solutions\Projects\Clyde's Garden Planner\Frost Data Database\GSOD Data\GSOD_RAW_DATA\1992\gsod_1992.txt";
int result = parse_raw_gsod_file(path, 32, myCallBack);
Console.Write("Parse completed with exit code: " + result.ToString());
Console.ReadLine();
} // end main function

public static void Report(string msg)
{
Console.Write("Message is ");
Console.WriteLine(msg);
}

} // End class
} // end namespace

Я попытался скопировать DLL в выходной каталог приложения, но он все еще не может ее найти. Я также попытался добавить проект DLL в качестве ссылки, но у меня появляется всплывающее окно, в котором говорится, что его нельзя добавить. Как правильно связать неуправляемую DLL с управляемым приложением?

Обновить — Вот полная ошибка:

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

Обновление 2 — Я точно знаю, что DLL находится в той же директории, что и .exe, пытающийся ее загрузить. Это заставляет меня думать, что в DLL есть зависимость, которая не загружается. Я использую только основные библиотеки C ++ в DLL (строка, математика, iostream и т. Д.). Есть идеи, что не может быть загрузка и почему?

Обновление 3 — Протестировано с Dependency Walker
Загрузка моей неуправляемой C ++ DLL в средство обхода зависимостей не показала ошибок. Я также попытался открыть свой исполняемый файл в средстве обхода зависимостей, и он показал ошибки при загрузке двух DLL: GPSVC.DLL и IESHIMS.DLL — не имеет никакого смысла, потому что я использую только стандартные библиотеки c ++ в своем коде. Я думаю, что это может быть связано с тем фактом, что у меня есть управляемая DLL C ++ / CLI, которая также пытается загрузить неуправляемую DLL (я пытался реализовать некоторые оболочки C ++ / CLI). Во всяком случае, я с тех пор запустил новое решение VS и пошел дальше. Смотри мой ответ.

3

Решение

По всей вероятности, проблема не в DLL, которую вы пытаетесь загрузить, а в одной из ее (цепочечных) зависимостей. Запустите зависимости.exe или аналогичную утилиту в библиотеке DLL, чтобы проверить, можно ли найти все зависимости. Вводящее в заблуждение сообщение «Указанный модуль не может быть найден» стало классическим раздражением (если не материалом FAQ!): Оно заставляет вас думать, что ваша DLL не найдена, когда почти все время это одна из его зависимостей, которая не быть найденным.

4

Другие решения

Для проверки * .dll должен находиться в том же каталоге, что и .EXE, который пытается загрузить его. Не доверяйте Visual Studio, чтобы сделать это для вас на данном этапе. Физически скопируйте файл в C: ****** \ Debug \ x86 \ bin \ или в любой другой конфигурации. Если сомневаетесь, скопируйте его во все папки вашего бина. После того, как вы выясните путь, вы начнете находить способы автоматизации сборки проекта для правильного копирования файла. Если это не сработает, поместите его в system32 — он обязательно найдет его там. Однако, если после этих действий вы все равно не сможете его найти. Вероятно, существует зависимость от вашей неуправляемой DLL, которая также отсутствует.

2

Сначала я хочу поблагодарить всех за помощь. К сожалению, я так и не решил эту проблему (см. Правки в моем основном вопросе). Ответом оказалось запуск совершенно нового решения Visual Studio и создание двух новых проектов: C # app и C ++ dll. Я избавился от необходимости в обертках, так как теперь я просто выполняю две основные функции.

Еще раз спасибо.

0

Ответ пользователя arayq2 имел много смысла, и я быстро смог решить и мою проблему.

DLL, которая не может быть загружена (DllNotFoundException) в моем случае, зависит от другой DLL. Эта dll (которая не является частью моего проекта) была фактически скомпилирована с более новыми версиями некоторых файлов .h и .lib. Более старые версии этих файлов .h и .lib (с тем же именем файла) были частью проекта, который скомпилировал dll, который не мог быть загружен.

После того, как я обновил свой проект dll новыми версиями этих файлов .h и .lib и перекомпилировал свой проект dll, моя проблема была решена.

Спасибо arayq2!

0
По вопросам рекламы [email protected]