gpt4 book ai didi

c# - dllimport : c code affect a struct passed by reference (c#)

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:49 25 4
gpt4 key购买 nike

我有一个包含公开函数的 c 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-使用指针而不是传递结构

每次我遇到不同的错误,比如数组不是指定类型低级错误(损坏的堆)

即使我没有在第一个结构中指定数组,size 成员也没有正确的值(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

关于c# - dllimport : c code affect a struct passed by reference (c#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com