Я получил «System.AccessViolationException», когда я пытаюсь вызвать метод из C ++ API. В resultXML_out я получил правильно отформатированный XML с данными, возвращенными как исключенные, но возникает исключение (именно для этого метода) и не может обработать это даже с блоком try catch. Я предполагаю, что должен как-то объявить память для resultXML_out, но я не знаю, как это сделать.
Вот объявление метода C ++ API:
SW_ErrCode SW_GetMyUserInfo (SW_LoginID lh, SW_XML *resultXML_out)
Декларация SW_XML:
const char * SW_XML
Вот мой код:
[StructLayout(LayoutKind.Sequential)]
public struct SW_LoginID
{
public int loginId;
}
[StructLayout(LayoutKind.Sequential)]
public struct SW_XML
{
public string xml;
}
[DllImport("sw_api.dll")]
[HandleProcessCorruptedStateExceptionsAttribute]
public static extern SW_ErrCode SW_GetMyUserInfo(SW_LoginID sh, out SW_XML resultXML_out);
И вот вызов этого метода:
SW_XML resultXML_out = new SW_XML();
resultXML_out.xml = "";
SW_ErrCode d = SW_GetMyUserInfo(login, out resultXML_out);
В API я нашел и такой метод. Но я не знаю, как правильно его использовать (или даже если это необходимо):
char* SW_AllocateString (unsigned size)
Но после того, как я прошел, например, 1000 программа завершает работу даже без исключения … Вот описание этой функции в документации API:
Выделите строку.
Возвращает строку, выделенную API
Задача ещё не решена.