Как я могу сделать вызов взаимодействия с использованием структуры в качестве параметра, который содержит строку - PullRequest
2 голосов
/ 29 августа 2011

Я пытаюсь вызвать функцию 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 #?

Ответы [ 2 ]

1 голос
/ 29 августа 2011
public static extern int GetFileType(ref StringParam stringParam, out int fileType); 
0 голосов
/ 29 августа 2011

Вы пробовали:

[DllImport("Custom.dll", CharSet = CharSet.Unicode)]
public static extern int GetFileType(StringParam stringParam, ref int fileType);

И я думаю, что вы должны закрепить ref int перед тем, как pInvoke.

...