none
請問關於在 C# 中 Recieve 從 DLL 所傳回的 struct 動態陣列 RRS feed

  • 問題

  • 請問我寫了一個 C++ 的 DLL 檔案

    當中定義如下結構

    struct UserIndex {
     int index;
     char* username;
    };

    撰寫一個函式如下

    UserIndex* DoSomething (int &Number)
    {
     // 細部處理先略過,先暫定要傳回的陣列大小為 2
     Number = 2;
     UserIndex *ui = new UserIndex[Number];

     // 第一筆資料
     ui[0].index = 0;
     ui[0].username = new char[10];
     strcpy(ui[0].username, "Tester1");

     // 第二筆資料
     ui[1].index = 1;
     ui[1].username = new char[15];
     strcpy(ui[1].username, "Tester2");

     return ui;
    }

    並且使用下面方式成為 DLL 輸出函數

    __declspec(dllexport) UserIndex* DoSomething(int & Number);

    若我透過另一個C++程式呼叫 DoSomething 函數能正確呼叫

    程式碼如下:

    #include "stdafx.h"
    #include <conio.h>
    #include <iostream.h>

    #pragma comment(lib, "xxxx.lib")

    struct UserIndex {
     int index;
     char* username;
    };

    __declspec(dllimport) UserIndex* DoSomething(int & Number);

    int main(int argc, char* argv[])
    {
     UserIndex *ui;
     int Number;
     ui = DoSomething(Number);
     cout << Number << endl;
     for (int i=0; i<Number; i++)
     {
      cout << uiIdea.index << endl;
      cout << uiIdea.username << endl;
     }
     _getch();
     return 0;
    }

    但是若我要在 C# 裏面,定義相同的 struct 陣列來接收傳回的來 UserIndex 動態陣列該如何做

    [StructLayout(LayoutKind.Auto)]
    public struct UserIndex
    {
     public int index;
     public String username;
    }
    [DllImport("xxxx.dll", EntryPoint = "?DoSomething@@YAPAUUserIndex@@AAH@Z", CallingConvention = CallingConvention.StdCall)]
    public static extern UserIndex[] DoSomething(ref int number);

    我用以下的方式在 Run-time 時會無法正常運作

    UserIndex[] ui;
    int accountNumber = -1;
    ui = DoSomething(ref accountNumber);

    會出現「無法封送處理'return value':無效的 Managed/Unmanaged型別組合。」的錯誤

    請問我在 C# 該怎麼修改才能接收 DLL 的傳回值,若真的沒辦法的話,我在 DLL 那邊還要做怎麼樣的修正呢?

    謝謝

     

    2006年8月7日 上午 06:22

所有回覆