none
請問陣列指標是否有替代方案? RRS feed

  • 問題

  • 要呼叫用C++撰寫的DLL函式,

    DLL中的原始碼:
    voida (unsigned char *data);

    以下是在C#

    SByte data= new SByte();
                data = 0;
                unsafe
                {
                    SByte* x;
                    x = &data;
                    voida(x);
                }
    

    丟SByte這樣做就可以順利執行voida這個函式。

    但是,現在遇到了一個問題,

    我現在要傳的指標,是一個SByte[]的位址,就沒辦法用同樣的方式去做。

    compile會有問題,有個DLL函式 Access();

    在C++的程式如下

    Access(unsigned char *Data); //在DLL中的涵式
    
    //以下是呼叫該函式
    
    Unsigned char Temp[2];
    
    Access(Temp);

    但是Unsafe中如果用如前所述同樣的方式,因為C# 沒有 SByte[]*,

    SBtye[] Temp=new SByte[2];
    
    Unsafe{
    Sbyte*[] x;
    x=&Temp
    Access(x);
    }


    compile的時候會說無法取得managed陣列的位址。


    我試過直接宣告 SBtye[] Temp=new SByte[2]; 然後 Access(Temp);

    這樣會出現TypeLoadException,

    想請教這樣的情況該怎麼解決呢?

    要怎樣傳遞參數才能讓Access函式順利執行?

    謝謝



    2009年7月8日 上午 06:01

解答

  • HI,

    您可以這樣試看看:
    SBtye[] Temp=new
     SByte[2];

    Unsafe{
    Sbyte* x;
    x=&Temp[0];
    Access(x);
    }
    • 已標示為解答 Lolota Lee 2009年7月16日 上午 08:14
    2009年7月9日 上午 02:06
  • unsigned char是byte不是SByte


    方法有2個
    1.
    在C#中將DLL宣告寫成

    void Access(byte[] Data)
    就可以直接傳陣列

    2.

    在C#中將DLL宣告寫成

    unsafe void Access(byte* Data)
    使用時的程式碼
    btye[] Temp=new byte[2];
    
    unsafe
    {
        fixed (byte* ptr = Temp)
        {
            Acess(ptr);
        }
    }
    

    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    • 已提議為解答 kgame 2009年7月11日 上午 02:41
    • 已標示為解答 Jonathan Hwu 2009年7月17日 上午 03:07
    2009年7月11日 上午 02:40

所有回覆

  • 我來舉一下我本身的例子好了。下面方式是可行的呀。
    原生DLL裡的Function
    void DLL_Export fnSetScanRawData2D(int Index, byte* pbyData,int ImageOrgX, int ImageOrgY)

    在C#裡包成這樣子。

    [DllImport("MyDll.dll", CharSet = CharSet.Auto, EntryPoint = "fnSetScanRawData2D")]
    public static extern void fnSetScanRawData(int Index, byte[] pbyData, int ImageOrgX, int ImageOrgY);

    使用方式像這樣子。
    int idx = 0;
    byte[] baArray = new byte[1000];
    int nOrgX = 0;
    int nOrgY = 0;
    fnSetScanRawData(idx, baArray, nOrgX, nOrgY);

    一切正常沒問題。
    2009年7月9日 上午 01:37
  • HI,

    您可以這樣試看看:
    SBtye[] Temp=new
     SByte[2];

    Unsafe{
    Sbyte* x;
    x=&Temp[0];
    Access(x);
    }
    • 已標示為解答 Lolota Lee 2009年7月16日 上午 08:14
    2009年7月9日 上午 02:06
  • unsigned char是byte不是SByte


    方法有2個
    1.
    在C#中將DLL宣告寫成

    void Access(byte[] Data)
    就可以直接傳陣列

    2.

    在C#中將DLL宣告寫成

    unsafe void Access(byte* Data)
    使用時的程式碼
    btye[] Temp=new byte[2];
    
    unsafe
    {
        fixed (byte* ptr = Temp)
        {
            Acess(ptr);
        }
    }
    

    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    • 已提議為解答 kgame 2009年7月11日 上午 02:41
    • 已標示為解答 Jonathan Hwu 2009年7月17日 上午 03:07
    2009年7月11日 上午 02:40