我正在使用游戏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。
如何解决此问题?
答案 0 :(得分:1)
为了完整性,这是Hans Passant提出的解决方案。
isset