"Не удалось найти точку входа с именем [функция] в dll "(преобразование типов c++ в C# )

у меня есть dll, которая исходит от третьей стороны, которая была написана на C++. Вот некоторая информация, которая приходит из документации dll:

//start documentation

RECO_DATA{
wchar_t Surname[200];
wchar_t Firstname[200];
}

описание: Структура данных для получения результата функции. Весь результат функции будет хранится как Unicode (UTF-8).

способ:

bool recoCHN_P_Name(char *imgPath,RECO_DATA *o_data);

вход:

char * imgPath

полный путь расположения изображения для этого функция распознавания

RECO_DATA * o_data
сведения для получения функции результат. Функция return : Правда, в случае успеха, false-в противном случае вернется.
//end documentation

Я пытаюсь вызвать recoCHN_P_Name из моего приложения c#. С этой целью я придумал этот код:

код для импорта библиотеки dll:

    public class cnOCRsdk
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct RECO_DATA{
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=200)]
        public string FirstName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
        public string Surname;
        }

    [DllImport(@"cnOCRsdk.dll", EntryPoint="recoCHN_P_Name")]
    public static extern bool recoCHN_P_Name(byte[] imgPath, RECO_DATA o_data);
}

код для вызова функции:

            cnOCRsdk.RECO_DATA recoData = new cnOCRsdk.RECO_DATA();

        string path = @"C:WINDOWStwain_32twainrgb.bmp";

        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        byte[] bytes = encoding.GetBytes(path);

        bool res = cnOCRsdk.recoCHN_P_Name(bytes, recoData);

и ошибка, которую я получаю ""Не удалось найти точку входа с именем "recoCHN_P_Name" в DLL " cnOCRsdk.в DLL'." Я подозревая, что у меня возникла ошибка при преобразовании типа С C++ в C#. Но где именно ?.. ?

7 ответов


сначала убедитесь, что функция действительно экспортируется:

в командной строке Visual Studio используйте dumpbin /exports whatever.dll


C# не поддерживает искажение имени C++, и вам либо нужно объявить функции C++ с

extern "C" {...}

(возможно, не вариант, если они от третьей стороны), или звоните искаженное имя напрямую, если вы можете заставить его работать. Возможно, будет проще заставить третью сторону предоставить не искаженный интерфейс для функциональности.


Solved-по крайней мере, до того момента, когда программа не ломается и фактически возвращает мне значение bool.

ключ, я думаю, должен был указать точку входа как "искаженное" имя

    [DllImport(@"cnOCRsdk.dll", EntryPoint="?recoCHN_P_Name@CcnOCRsdk@@QAE_NPADPAURECO_DATA@@@Z")]
    public static extern bool recoCHN_P_Name(ref string imgPath, ref RECO_DATA o_data);

после этого я получил некоторые другие ошибки, но "не удалось найти точку входа" ушел.


Я бы написал оболочку, используя C++ / CLI. Эта обертка сможет включать в себя .h файлы и ссылка на.lib-файлы, которые вы получили от стороннего поставщика. Тогда легко и безопасно написать управляемый интерфейс для вашей программы на C#.


я решил ту же проблему в этих шагах:

Шаг 1) если вы программируете свою пользовательскую DLL на C++ с помощью Visual studio, то на странице свойств вашего проекта установите до Common Language Runtime Support (/clr).

Шаг 2) функции торможения в .h использовать файл __declspec(dllexport) ключевое слово, как показано ниже:

__declspec(dllexport) double Sum(int a,int b);

Шаг 3) создайте и экспортируйте DLL-файл, затем используйте Зависимость Walker программное обеспечение для получения функция EntryPoint.

Шаг 4) импортировать DLL-файл в проект C# и установить EntryPoint и CallingConvention переменной, как показано ниже:

[DllImport("custom.dll", EntryPoint = "?Sum@@YAXHHHHHHNNN@Z", CallingConvention = CallingConvention.Cdecl)]

    public static extern double Sum(int a,int b);

вы можете попробовать использовать unmangled имя при указании CallingConvention в DllImport


правильно EntryPoint строка может быть найден в ".lib " файл, который поставляется вместе с основной неуправляемой dll.