vb. net передача массива в C ++ вызывает ошибку стека - PullRequest
1 голос
/ 14 марта 2020

У меня есть код, который был изначально написан на C ++ как файл lib. Я преобразовал его в DLL и у меня работают некоторые подпрограммы, но когда я нажимаю на функцию, передающую массив, я получаю ошибку стека. Я не программист на C ++, но из того, что я прочитал, 'uint32_t *' означает, что его нужно передавать как ссылку, но я не уверен, как именно это сделать. Я пробовал ByRef x () как IntPtr, ByRef x как Uint32 et c. Это также может быть оператор dim, но я не уверен.

вот код:

' C++ declaration
extern __declspec(dllexport) int rdrand_get_n_32(unsigned int n, uint32_t* x);

' VB.net dll import
<DllImport("drng.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function rdrand_get_n_32(ByVal n As Integer, ByRef x As IntPtr) As Integer
End Function

' C# equivalent
[DllImport("drng.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static int rdrand_get_n_32(int n, ref IntPtr x);

' vb code
Dim array32(9) As Integer

r = rdrand_get_n_32(RDRandCutoff, array32)      ' This line errors
If r = DRNG_SUCCESS Then
    ' do something
Else
    Console.Write("rdrand instruction failed with code {0:D}" & vbLf, r)
End If

Ошибка: Помощник по управляемой отладке 'FatalExecutionEngineError': 'Во время выполнения обнаружена фатальная ошибка , Адрес ошибки был 0x716b9e97, в потоке 0x3058. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки пользовательского маршалинга для COM-взаимодействия или PInvoke, которые могут повредить стек. '

1 Ответ

2 голосов
/ 14 марта 2020

Я понял, что случилось. Dllimport должен быть.

'VB. net dll import Publi c Общая функция rdrand_get_n_32 (ByVal n как целое число, Byval x как uint32 ()) как целочисленная конечная функция

...