【问题标题】:How would the following c(++)-struct be converted to C# for p/invoke usage如何将以下 c(++)-struct 转换为 C# 以供 p/invoke 使用
【发布时间】:2011-04-11 21:22:33
【问题描述】:

我试图包装一个较旧的 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;

【问题讨论】:

  • 由于我们不知道 n_char、n_long、PARvalue、n_ushort 和 n_long 是什么,所以很难提供帮助。 n_*** 和 *** 总是等价的吗?请告诉我们PARvalue是什么。
  • 好的...在这里我认为这些是不错的普通 c 类型。我的错。我也有 VB 替代品。已更新问题。不确定 C# 中是否需要填充?
  • 所以 PARvalue 是一个变体
  • 顺便说一句,你的 Delphi 版本是错误的。您应该使用带符号的等效整数和短整数,而不是无符号的 longword 和 word。为什么不使用变体?

标签: c# struct pinvoke


【解决方案1】:

结构应该是这样的......

[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++ 中编组值以来已经有一段时间了,但我希望这会有所帮助。

【讨论】:

  • param_type 应该是 UInt16 我相信。您不需要指定 ANSI 字符还是在函数调用中完成?否则,我认为这是正确的,而您在几分钟内就击败了我。
  • 是的。默认情况下它是 ANSI(但在 VB.NET 中不是)。 Variant 的等价物是 object.
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多