非托管代码调用,数组解析

时间:2017-02-20 13:16:19

标签: c# arrays unmanaged

我正在使用游戏Arma 3,您可以在其中编写自己的扩展(意味着C ++或C#库)。这些扩展具有已定义的入口点,即此DLL接口

void __stdcall RVExtension(char *output, int outputSize, const char  *function);
int __stdcall RVExtensionArgs(char *output, int outputSize, const char *function, const char **args, int argCnt);

将此实现到C#时,RVExtension的入口点将是

[DllExport("_RVExtension@12", CallingConvention = CallingConvention.Winapi)]
public static void RvExtension(StringBuilder output, int outputSize,
    [MarshalAs(UnmanagedType.LPStr)] string function)
{
    output.Append("Foo");
}

我正在使用this库作为DLLExport。

由于RVExtensionArgs的切入点很新,我还想实现它。到目前为止,我的解决方案是:

[DllExport("_RVExtensionArgs@20", CallingConvention = CallingConvention.Winapi)]
public static int RvExtensionArgs(StringBuilder output, int outputSize,
    [MarshalAs(UnmanagedType.LPStr)] string function, [MarshalAs(UnmanagedType.LPArray)] string[] args,
        int argCount)
{
    output.Append("Foo");
}

一般情况下,这适用于args参数传递的数组未正确转换。您只获得传递数组的第一个元素。

我尝试定义LPArray SizeConst属性,但这必须是我无法提供的固定大小。传递的数组元素最多可达1024.另外,在使用我的测试控制台访问DLL时,我遇到了MarshalException。

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

为了完整性,这是Hans Passant提出的解决方案。

isset