Шаги C#, вызывающие C++ DLL, и обнаруженные искаженные символы.

Динамическая библиотека C++ DLL Lib_LR.dll:

Объявление функции:
DLL_API_LR недействительным GetAuthInfo(char* strCode);

Определение функции:

Два входных параметра, два выходных параметра

void GetAuthInfo (int inPrama1, char * inParam2, int outParam1, char * outParam2)
{     char buff [2048];     набор памяти (бафф, 0, 2048);     std::ifstream inFile("license.lr", std::ios::binary);     если (inFile.fail())     {         return;     }     else     {         inFile.read(buff, sizeof(temp));         inFile.close();     }     memcpy(outParam2, buff, outParam2.length());












    строка strCode=outParam2;

    outParam1=strCode.length();
}

Процесс вызова С#:

Ссылка на функцию:

[DllImport("Lib_LR.dll", EntryPoint = "GetAuthInfo", CallingConvention = CallingConvention.Cdecl)]
public static extern void GetAuthInfo(ref int InParam1, string nInPrama2, StringBuilder strCode);

вызов функции:

интервал inParam1=0;

внутренний параметр1=0;

строка inParam2 = "Тест";

StringBuilder outParam2 = новый StringBuilder (1024);

//Примечание: при вызове функции параметр экспорта типа int должен добавлять ref, а параметр экспорта строки должен объявлять тип StringBuilder

GetAuthInfo (inParam1, inParam2, ссылка outParam1, outParam2);

Возникшие проблемы:

1. Несоответствие платформы:

Проект C# — это проект webapi, основанный на ядре .net. Платформой компиляции по умолчанию является любой процессор, а платформой проекта C++ DLL по умолчанию — x86. Проблема соответствия. Вы можете попытаться решить ее следующими способами: выбрать x86 или x64 при компиляции проектов C++ DLL и C# (исходя из того, что операционная система 64-битная).

2. Проблема с искаженным кодом:

При вызове функции GetAuthInfo полученный strCode искажается.Решение, приведенное в Интернете, состоит в том, чтобы изменить метод объявления параметра функции public static extern voidGetAuthInfo([MarshalAs(UnmanagedType.LPStr)] StringBuilder strCode). Но я попробовал этот метод, он не работал. Наконец, это решается модификацией исходного кода DLL: добавьте outParam2[strCode.length()] = '\0' в конце функции GetAuthInfo, эта строка кода предназначена для добавления терминатора в конец массива строк. .

Supongo que te gusta

Origin blog.csdn.net/landeli2/article/details/127162399
Recomendado
Clasificación