none
c# call c++ dll struct RRS feed

  • 問題

  • Internal limitation: structure is too complex or too large


    c++code

    #define     DB_MAX      1000

    typedef struct _DT_STR
    {
        BASE        base;
        CTL         ctl[DB_MAX];
        API_BIR     BIR[DB_MAX];
    } DB_STR;

    int InitAV (DB_STR *bir)


    C#code 
    public const int DB_MAX = 1000;
    [StructLayout(LayoutKind.Sequential)]
     public struct DB_STR
     {
        public BASE myBASE;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DB_MAX)]
        public CTL[] ctl;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DB_MAX)]
        public API_BIR[] BIR;
     }

    int i = InitAV(ref str);



    • 已編輯 追風 2012年1月28日 上午 09:16
    2012年1月21日 上午 04:40

解答

  • 不管是不是自訂型別, 指標型態對應到C#程式語言就是IntPtr, 如果C++開發的DLL將DB_MAX定義成800, 要突破這個限制就只有修改C++的DLL的原始碼
    • 已標示為解答 追風 2012年2月1日 下午 12:09
    2012年1月22日 上午 10:58

所有回覆

  • BASE , CTL , API_BIR 這三個是甚麼?

     


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2012年1月21日 下午 01:50
  • 以下資訊給您參考,謝謝!

    Pointers in C#


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2012年1月21日 下午 02:50
  • 指標要用IntPtr, 不是ref

    2012年1月21日 下午 02:51
  • 那是自訂型別
    2012年1月22日 上午 07:46
  • 我現在是要呼叫C++開發的dll

    #define     DB_MAX      800

    在C++中如果DB_MAX=800以下是可以正常執行的

    要如何突破這個限制

    因為我要的值大於800

    謝謝你的回覆

     

     

    2012年1月22日 上午 07:53
  • 不管是不是自訂型別, 指標型態對應到C#程式語言就是IntPtr, 如果C++開發的DLL將DB_MAX定義成800, 要突破這個限制就只有修改C++的DLL的原始碼
    • 已標示為解答 追風 2012年2月1日 下午 12:09
    2012年1月22日 上午 10:58
  • tihs

    能否請教要如何修改

    #define     DB_MAX      1000

    typedef struct _DT_STR
    {
        BASE        base;
        CTL         ctl[DB_MAX];
        API_BIR     BIR[DB_MAX];
    } DB_STR;

    int InitAV (DB_STR *bir)

    2012年1月27日 上午 02:49
  • 確實是用IntPtr就可以解決了!謝謝你。
    2012年2月1日 下午 12:09