如何将以下c(++) - struct转换为C#以进行p / invoke使用

时间:2011-04-11 21:22:34

标签: c# struct pinvoke

我试图包装一个旧的dll并遇到代表它在C#中使用的结构的问题。我尝试过的任何东西似乎都没有用。任何能够提供帮助的魔术师?

typedef struct _PARAM_BYNAME_DATA 
{ 
    n_char *szPntName; /* (in) point name */ 
    n_char *szPrmName; /* (in) parameter name */ 
    n_long nPrmOffset; /* (in) parameter offset */ 
    PARvalue *pupvValue; /* (in/out) parameter value union */ 
    n_ushort nType; /* (in/out) value type */ 
    n_long fStatus; /* (out) status of each value access */ 
} PARAM_BYNAME_DATA; 

如果有帮助,下面是VB端口。

Type param_byname_data 
    point_name As String
    param_name As String
    param_offset As Long
    padding1 As Long 'for byte alignment between VB and C 
     param_value As Variant
    param_type As Integer
    padding2 As Integer 'for byte alignment between VB and C 
    status As Long status As Long 
End Type

以下Delphi也是......

PARAM_BYNAME_DATA=record
    PntName:pchar;       // (in) point name
    PrmName:pchar;       // (in) parameter name
    PrmOffset:longword;  // (in) parameter offset
    pValue:pointer;      // (out) parameter value union
    nType:word;          // (out) value type
    fStatus:longword;    // (out) status of each value access */
end;

1 个答案:

答案 0 :(得分:2)

结构应该看起来像这样......

[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
    public string point_name;
    public string param_name;
    public Int32 param_offset;
    public VariantWrapper param_value;
    public Int32 param_type;
    public Int32 status;
};

这是一个good article,它讨论了应该有用的结构和对齐方式。主要是结构布局和位对齐。已经有一段时间了,因为我不得不用C ++编组值,但我希望这会有所帮助。