Я пытаюсь вызвать функцию C ++ в DLL из C # через взаимодействие. DLL была написана кем-то другим. Сигнатура функции выглядит следующим образом:
AXI_DLL_EXPORT int __stdcall GetFileType(StringParam *stringParam, int *fileType)
StringParam - это структура, определяемая следующим образом:
struct StringParam
{
int size; // 4 byte integer for the size of the string buffer
LPWSTR buff; // Pointer to a wide char buffer
}
Эта структура используется для передачи строк вперед и назад. Может использоваться как в качестве входных, так и выходных параметров. Назначение поля размера в структуре в первую очередь для возврата строк вызывающей стороне и для указания размера требуемого буфера. Если размер буфера (предоставленного вызывающей стороной) слишком мал для хранения строки, вызывающая сторона может быть проинформирована об этом и затем может предоставить больший буфер при последующем вызове функции.
В C # я создал соответствующую структуру следующим образом:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct StringParam
{
public int Size;
[MarshalAs(UnmanagedType.LPWStr)]
public string Text;
public StringParam(string text)
{
this.Text = text;
this.Size = text.Length;
}
}
Я объявил вызов функции DllImport следующим образом:
[DllImport("Custom.dll", CharSet = CharSet.Unicode)]
public static extern int GetFileType(StringParam stringParam, out int fileType);
Сбой вызова со следующей ошибкой:
При вызове функции PInvoke '... GetFileType' разбалансирован стек. Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.
Как мне объявить структуру и вызвать нативную функцию из C #?