Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 封送包含char*成员的非托管结构_C#_C++_Marshalling_Structlayout - Fatal编程技术网

C# 封送包含char*成员的非托管结构

C# 封送包含char*成员的非托管结构,c#,c++,marshalling,structlayout,C#,C++,Marshalling,Structlayout,我正在使用一个回调函数,从非托管代码到托管C#代码。回调函数有一个参数void*eventData。EventData可以是几种不同的结构类型。在我的C代码中,我将eventData定义为IntPtr,并使用Marshal.PtrToStructure获取结构。对于大多数结构,我没有问题。但是,我遇到了处理此问题的问题: //! Structure for dose parameters typedef struct { //! the dose in µGrays float

我正在使用一个回调函数,从非托管代码到托管C#代码。回调函数有一个参数
void*eventData
。EventData可以是几种不同的结构类型。在我的C代码中,我将eventData定义为
IntPtr
,并使用
Marshal.PtrToStructure
获取结构。对于大多数结构,我没有问题。但是,我遇到了处理此问题的问题:

//! Structure for dose parameters

typedef struct
{
    //! the dose in µGrays
    float dose;

    unsigned short nbParameters;
    //! the corresponding parameters specified in the .ini file
    struct Parameters
    {
        //! parameter text
        const char* text;
        //! parameter value
        float value;
    } * parameters;

} DoseParameters;
以下是我对结构的C#定义:

/// <summary>
/// Structure for dose parameters
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct DoseParameters {
    //! the dose in µGrays
    public float dose;

    public ushort nbParameters;
    //! the corresponding parameters specified in the .ini file

    [StructLayout(LayoutKind.Sequential)]
    public struct Parameters{
        //! parameter text        
        public string text;
        //! parameter value        
        public float value;
    }

    [MarshalAs(UnmanagedType.ByValArray)]
    public Parameters[] parameters;
}
//
///剂量参数的结构
/// 
[StructLayout(LayoutKind.Sequential)]
公共结构DoseParameters{
//!剂量单位为µ灰色
公众漂浮剂量;
公共参数;
//!在.ini文件中指定的相应参数
[StructLayout(LayoutKind.Sequential)]
公共结构参数{
//!参数文本
公共字符串文本;
//!参数值
公众浮动价值;
}
[Marshallas(UnmanagedType.ByValArray)]
公共参数[]参数;
}
正确转换剂量和NB参数值。这是我正在努力解决的参数数组。长度始终为1,对于该实例,Parameters.text是不可理解的,Parameters.value远远大于它应该的长度


这似乎与char*的长度不确定有关。虽然,我对StructLayout/Marshallas这类东西还不太熟悉,所以对这一切都不太确定。我使用过各种MarshalAs、LayoutKind、Explicit和FieldOffset组合,但都没有成功(显然)。我做了一些搜索,没有发现任何与我的情况类似的东西

我相信可以在C#中的char*类型上添加一个length属性,使其能够很好地转换

实际上有一个转换工具,p/Invoke Interop Assistant,您可能想签出(在[1]中提到)。它从C代码生成用于互操作的C代码。我曾在一个项目中使用过一次,效果很好

[1]

编辑:添加工具名称


编辑:类似?

通过将
doseparameters.parameters
成员更改为
IntPtr
并使用JaredPar的答案解决了这个问题:

[Marshallas(UnmanagedType.ByValArray)]
肯定是不正确的——我怀疑它应该是
UnmanagedType.LPArray