如何在C#中封送含uint数组的C结构体并调用DLL方法?
问题描述
我在其他地方见过类似问题的解答,但均无法解决我的问题,且这些问题与我的情况略有不同。
我有一个DLL,其中某方法的参数是一个包含uint数组的结构体指针。以下是旧版C头文件中的定义:
typedef struct HandleArrayType { uint32_t HandleArray[max_number_100]; }HandleArrayType; typedef HandleArrayType *HandleArrayPtrType; typedef bool (*type_connectToMultiple)(char *CommaSeparatedString, HandleArrayPtrType ArrayPointer, uint32_t numberOfOpensAttempted) __attribute__((cdecl));
我们尝试了多种封送方式,最后尝试的方案出现了内存访问违规:
[StructLayout(LayoutKind.Sequential)] public struct HandleArrayType { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public uint[] HandleArray; } [DllImport("file", CallingConvention = CallingConvention.Cdecl)] internal static extern bool ConnectToMultiple(string[] nameArray, ref HandleArrayType myStruct, uint numAttempted);
我还尝试过以下写法,虽然能建立连接,但只获取到一个句柄而非预期的两个,且句柄数值异常,说明结构体封送存在问题:
[DllImport("file", CallingConvention = CallingConvention.Cdecl)] internal static extern bool ConnectToMultiple(IntPtr commaSepHandlesString, uint[] handles , ref uint numAttempted);
(调用时我们将句柄字符串封送为IntPtr)
若有人知晓正确的封送方式,请提供解决方案。目前我们使用的临时方案效率极低(而速度对我们来说至关重要)。
编辑:我们通过安装新版DLL提升了临时方案的效率,这已不再是大问题,但ConnectToMultiple方法仍无法正常工作,仍好奇如何使其正常运行。
内容的提问来源于stack exchange,提问作者Plaje
相关产品推荐
相关产品推荐

