"Не удалось найти точку входа с именем [функция] в 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);
правильно EntryPoint строка может быть найден в ".lib " файл, который поставляется вместе с основной неуправляемой dll.