Преобразование функции из Visual Basic 6.0 в C # вызывает исключение AccessViolationException - PullRequest
0 голосов
/ 10 ноября 2009

Я конвертирую функцию из Visual Basic 6.0 как:

Declare Function RequestOperation Lib "archivedll" (ByVal dth As Long, ByVal searchRequestBuf As String, ByVal buflen As Long, ByVal FieldNum As Long, ByVal OP As Long, ByVal value As String) As Long

В C # я объявляю функцию как:

[DllImport("archivedll")]
public static extern int RequestOperation(int dth ,StringBuilder searchRequestBuf, int bufferLen, int fieldNum, int op, string value);

При вызове RequestOperation из C # выдается исключение:

[System.AccessViolationException] = {"Попытка чтения или записи защищена объем памяти. Это часто является показателем эта другая память повреждена. "}

Я успешно вызвал много других функций, подобных этой, но только эта функция вызывает исключение.

Ответы [ 3 ]

3 голосов
/ 10 ноября 2009

Эта функция явно не выдает AccessViolationException - вместо этого она генерирует ошибку нарушения доступа путем «попытки чтения или записи защищенной памяти». .NET переводит эту ошибку в AccessViolationException.

Вам нужно выяснить, почему он "пытается читать или записывать защищенную память". В частности, вы инициализировали StringBuilder, который вы передаете ему? Пожалуйста, опубликуйте код, который вы используете для вызова этого метода.

0 голосов
/ 10 ноября 2009
/// Return Type: int
///dth: int
///searchRequestBuf: BSTR->OLECHAR*
///buflen: int
///FieldNum: int
///OP: int
///value: BSTR->OLECHAR*
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="RequestOperation")]

открытый статический extern int RequestOperation (int dth, [System.Runtime.InteropServices.MarshalAsAttribute (System.Runtime.InteropServices.UnmanagedType.BStr)] string searchRequestBuf, int buflen, int FieldNum, int OP, [System.Runtime.InopSystem .MarshalAsAttribute (System.Runtime.InteropServices.UnmanagedType.BStr)] строковое значение);

0 голосов
/ 10 ноября 2009

Я думаю, что StringBuilder в объявлении функции как-то связано с этим. Вместо этого вы должны использовать просто String.

...