簡體   English   中英

dllimport:C代碼影響通過引用傳遞的結構(C#)

[英]dllimport : c code affect a struct passed by reference (c#)

我有一個包含公開函數的ac dll,它帶有三個參數:

int ParseInput(char* opt_path, char* input, SENNA_RESULT_ARRAY* result);

我想從C#調用它,它實際上有效。 問題是結果結構不受影響。 這是用c代碼定義的結構:

    typedef struct RESULT_
{
    char* word;
    int pos_start;
    int pos_end;
    char* pos;
    char* chk;
    char* ner;
    char* psg;

} RESULT;

typedef struct RESULT_ARRAY_
{
    int size;
    RESULT* Results;    
} RESULT_ARRAY;

和我的C#代碼:

[StructLayout(LayoutKind.Sequential)]
    public struct SENNA_RESULT
    {
        [MarshalAs(UnmanagedType.LPStr)]
        public string word;
        [MarshalAs(UnmanagedType.I4)]
        public int pos_start;
        [MarshalAs(UnmanagedType.I4)]
        public int pos_end;
        [MarshalAs(UnmanagedType.LPStr)]
        public string pos;
        [MarshalAs(UnmanagedType.LPStr)]
        public string chk;
        [MarshalAs(UnmanagedType.LPStr)]
        public string ner;
        [MarshalAs(UnmanagedType.LPStr)]
        public string psg;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SENNA_RESULT_ARRAY
    {
        public SENNA_RESULT[] Results;     
        public int size;
    }

    [DllImport("Senna-32.dll", CharSet = CharSet.Ansi)]
    static extern int Parse(string msg, string stream, ref SENNA_RESULT_ARRAY results);

Parse(@"path", "sentence", ref result_array)

我已經嘗試了很多事情,例如:1-使用類而不是沒有ref關鍵字的結構2-使用指針而不是傳遞結構

每次我遇到不同的錯誤(例如數組)都不是指定類型的低級錯誤(損壞的堆)

即使我沒有在第一個結構中指定數組,大小成員也沒有正確的值(C代碼在控制台中打印該值)

有什么建議嗎?

謝謝

考慮使用下面的代碼。

[StructLayout(LayoutKind.Sequential)]
public struct SENNA_RESULT
{
    public IntPtr word;
    public int pos_start;
    public int pos_end;
    public IntPtr pos;
    public IntPtr chk;
    public IntPtr ner;
    public IntPtr psg;
}

[StructLayout(LayoutKind.Sequential)]
public struct SENNA_RESULT_ARRAY
{
    public IntPtr Results;     
    public int size;
}

[DllImport("Senna-32.dll")]
static extern int Parse(string msg, string stream, out SENNA_RESULT_ARRAY results);

這是用法示例

        SENNA_RESULT_ARRAY array = new SENNA_RESULT_ARRAY();
        int result = Parse("path", "sentence", out array);
        if (result == SUCCESS && array.Results != IntPtr.Zero)
        {
            for (int index = 0; index < array.size; index++)
            {
                IntPtr offset = (IntPtr)((int)array.Results + index * Marshal.SizeOf(typeof(SENNA_RESULT)));
                SENNA_RESULT senna = (SENNA_RESULT)Marshal.PtrToStructure(offset, typeof(SENNA_RESULT));
            }
        }

我希望您了解這只是想法。 確保代碼正常運行,然后對其進行改進以使其更易於使用。 我說的是用string替換IntPtr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM