You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:16:05