DllImport для csharp из cpp;строит, но застревает в функции cpp при запуске - PullRequest
0 голосов
/ 10 сентября 2018

Код создается без ошибок, но когда я его запускаю, он застревает в функции, которая вызывается из DllImport в csharp. Я отслеживал это с помощью Debug.WriteLine (), чтобы подтвердить, где код застревает.

Строка DllImport в проекте csharp:

    [DllImport("GettingData.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
    static unsafe extern bool GenerateItems(out ItemsSafeHandle itemsHandle,
        out double* items, out int itemCount);

    [DllImport("GettingData.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
    static unsafe extern bool ReleaseItems(IntPtr itemsHandle);

Код dllexport из проекта cpp выглядит следующим образом. Обратите внимание, что коды используют заголовочный файл и cpp из-за ошибки сборки, когда функции, определяемые в проекте cpp, были «уже» определены в App.xaml.h. Таким образом, чтобы исправить это, класс определен в заголовочном файле, а определения функций-членов находятся в файле cpp.

  1. Заголовок:

    #define EXPORT extern "C" __declspec(dllexport)
    typedef intptr_t ItemListHandle;
    
  2. каст:

    EXPORT bool GenerateItems(ItemListHandle* hItems, double** itemsFound, int* itemCount)
    {
        auto items = new std::vector<double>();
        for (int i = 0; i < 500; i++)
        {
            items->push_back((double)i);
        }
    
        *hItems = reinterpret_cast<ItemListHandle>(items);
        *itemsFound = items->data();
        *itemCount = items->size();
    
        return true;
    }
    
    EXPORT bool ReleaseItems(ItemListHandle hItems)
    {
        auto items = reinterpret_cast<std::vector<double>*>(hItems);
        delete items;
    
        return true;
    }
    

Я следую за самым популярным ответом на этот пост здесь , чтобы получить минимально необходимый код. Поскольку я выполняю это в решении UWP и не могу использовать оболочку C ++ / CLI в качестве другого проекта как часть этого решения.

...