结构数组永远不会收到项目,但方法说它确实如此

时间:2009-12-10 00:46:35

标签: c# arrays pinvoke

我的另一个愚蠢的P / Invoke问题......有时候我认为这些东西会是一块蛋糕,但它会在我脸上爆炸。

我有一个简单的非托管方法,它接受一个目标数组并填充它。

unsigned short NvtlCommon_GetAvailableDevices(SdkHandle session,  
    DeviceDetail * pDev_list, unsigned long * dev_list_size) 

typedef struct
{
    DeviceTechType          eTechnology;
    DeviceFormFactorType    eFormFactor;
    char                    szDescription[NW_MAX_PATH];
    char                    szPort[NW_MAX_PATH];
    char                    szFriendlyName[NW_MAX_PATH];
} DeviceDetail;

我将这些转换为C#:

[DllImport(NvtlConstants.LIB_CORE, EntryPoint = "NvtlCommon_GetAvailableDevices")]
public static extern NvtlErrorCode GetAvailableDevices(IntPtr session,
    DeviceDetail[] pDev_list, ref long dev_list_size);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DeviceDetail {
    public DeviceTechType eTechnology;
    public DeviceFormFactorType eFormFactor;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NvtlConstants.NW_MAX_PATH)]
    public string szDescription;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NvtlConstants.NW_MAX_PATH)]
    public string szPort;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NvtlConstants.NW_MAX_PATH)]
    public string szFriendlyName;
}

文档说明在输入时,dev_list_size应该是已分配数组的大小。在输出时,它是实际填充的项目数。如果我在out参数上使用refpDev_list,我的应用程序崩溃了。这似乎是唯一开始工作的签名。

DeviceDetail[] devices = new DeviceDetail[5];
long count = 5;
GetAvailableDevices(coreHandle, devices, ref count);

该代码返回成功消息,count设置为1,这确实是可用设备的数量。但是,该数组仍然是5个未初始化的DeviceDetail结构。

我在这里做错了什么,或者这是底层非托管库的问题?

1 个答案:

答案 0 :(得分:1)

您是否尝试过[Out]

public static extern NvtlErrorCode GetAvailableDevices(IntPtr session,
    [Out] DeviceDetail[] pDev_list, ref long dev_list_size);
      ↑