Импорт функции из неуправляемой DLL в приложении C # - PullRequest
1 голос
/ 14 декабря 2010

Мне нужно импортировать функцию, которую я написал на C ++ и которая теперь скомпилирована в DLL, в мое приложение на C #.Все строится без ошибок и предупреждений, но когда я выполняю код, первый вызов функции в DLL выдает Exception с сообщением «Невозможно найти точку входа с именем« CreateScanEngine »в DLL« WMIQuery.dll »».Функция объявлена ​​так в моем приложении на C #:

internal static class WMIQuery
{
    [DllImport("WMIQuery.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    internal static extern void CreateScanEngine();
}

Зависимость Уокер показывает функцию в DLL следующим образом:

Порядковый: 1 (0x0001)Подсказка: 0 (0x0000)Функция ^: void CreateScanEngine (void)Точка входа: 0x00001860

Dependency Walker также показывает следующие ошибки / предупреждения для DLL:

Ошибка: по крайней мере одна необходимая неявная или переадресованная зависимость не найденаПредупреждение. По крайней мере один модуль зависимости задержки и загрузки не найден.Предупреждение: по крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в модуле, зависящем от задержки и загрузки.

Будет ли это иметь значение?Кроме того, я попытался добавить DLL в качестве ссылки на проект C #, и я получил эту ошибку:

Ссылка на [моя DLL] не может быть добавлена.Пожалуйста, убедитесь, что файл доступен, и что это допустимая сборка или компонент COM.

Кто-нибудь знает, что я делаю неправильно?Спасибо.

Ответы [ 2 ]

4 голосов
/ 14 декабря 2010

Не используйте Dependency Walker, он деформирует экспортированное имя функции и не сообщает вам реальное имя экспорта.Обратите внимание, что он достаточно умен, чтобы видеть, что он не принимает аргументов и не имеет возвращаемого значения.Он может сделать это только в том случае, если видит имя как оформленное компилятором C ++.

Используйте Dumpbin.exe / exports в DLL, чтобы увидеть настоящее имя.Это должно быть «? CreateScanEngine @@ YGXXZ», используйте свойство EntryPoint в атрибуте [DllImport].Возможно, вы также захотите объявить функцию с помощью extern «C», чтобы это искажение имени не происходило.

1 голос
/ 14 декабря 2010

Как вы объявляете CreateScanEngine в своем коде C ++?

Попробуйте изменить на:

extern "C" __declspec(dllexport) void __stdcall CreateScanEngine();
...