Как мне вернуть массив int из C ++ в VB.NET в DLL? - PullRequest
2 голосов
/ 17 октября 2019

У меня есть функция DLL, и я хочу, чтобы эта функция возвращала массив целых чисел.

Мое определение функции следующее:

extern "C" void HelloWorldArray(int * &A) {

    std::vector<int> *pVectorA = new std::vector<int>;

    pVectorA->push_back(2);
    pVectorA->push_back(4);
    pVectorA->push_back(8);
    pVectorA->push_back(16);
    pVectorA->push_back(32);

    A = pVectorA->data();

}

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

В VB.NET я пытаюсь это:

Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("dll.dll", CallingConvention:=CallingConvention.Cdecl)>
    Private Shared Function HelloWorld(ByVal x As Int32) As Int32
    End Function

    Private Declare Function HelloWorld Lib "dll.dll" (int) As Integer
    Private Declare Function HelloWorldArray Lib "dll.dll" (int())

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim j As Integer()

        HelloWorldArray(ByRef j as Integer())
        Console.WriteLine(j)

    End Sub

End Class

Что даже не компилируется, это дает BC30201 Expression expected. для строки Private Declare Function HelloWorldArray Lib "dll.dll" (int()).

Любые советы о том, как вернуть массив неизвестной длины из C ++ в VB.NET, приветствуются.

Примечание: массив должен передаваться по ссылке в аргументах, а не как элемент возврата, потому что в реальном приложении несколько массивов необходимо переместить обратно в VB.NET.

Я использую Visual Studio 2017.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...