PInvoke寻址

时间:2012-02-09 11:51:23

标签: c# c++ debugging pinvoke dllimport

我在C ++中有一个带有两个参数的方法:byte和ushort,它返回指向非常困难结构的指针(它几乎是C ++项目中提供的所有结构的联合)。

当我在C#中使用DllImport调用此方法时,例如传递1和2,它会调用一些随机字节数和1(因此第一个参数作为第二个传递,而真正的第一个参数是从一些不同的记忆的地址。)

我能想到的唯一一个解释是返回结构没有正确映射,因此所有参数都有偏移量。但我不知道如何检查它。是否有任何工具可以显示由C#生成的编组数据的地址和大小,所以我可以用我在C ++中收到的地址检查它们?或者您可以建议的任何其他解决方案。

---更新---

在评论C ++和C#的代码结构后,我将测试代码减少到: C ++:

enum PrimitiveType: unsigned short
enum ErrorType : unsigned char 

typedef struct
{
  PrimitiveType Primitive;
  unsigned char InstNo;       /* The instance number. */
  ErrorType ErrorCode;         /* ERR_NO_ERROR */
  unsigned char Active;                      /* True = relay active */
 } GetRelayCfmType;

sizeof(GetRelayCfmType)= 5

C#:

enum PrimitiveType : ushort
enum ErrorType : byte

    [StructLayout(LayoutKind.Sequential)]
    public struct GetRelayCfmType
    {
        public PrimitiveType Primitive;
        public byte InstNo;                         /* The instance number. */
        public ErrorType ErrorCode;          /* RTX2300_ERR_NO_ERROR */
        public byte Active;                      /* True = relay active */
    };

Marshal.Sizeof(new GetRelayCfmType())== 6.

为什么尺寸在一个字节中有所不同? 的 UPD。

现在我的功能是(C ++):

__declspec(dllexport) GetRelayCfmType __stdcall GetRelay_Blocking(unsigned char InstNo, RelayNoType No)

 enum RelayNoType : unsigned char

所以在C#中我有:

[DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] 
    public static extern GetRelayCfmType GetRelay_Blocking(byte InstNo, RelayNoType No);

enum RelayNoType : byte

现在图片已满。

1 个答案:

答案 0 :(得分:0)

在您请求我们的帮助之前,您显然需要更多信息。看一下这篇文章:http://msdn.microsoft.com/en-us/library/eahchzkf(v=vs.100).aspx注意所做的陈述。

  

虽然您可以使用Marshal.SizeOf方法,但返回的值   此方法并不总是与sizeof返回的值相同。   Marshal.SizeOf在类型被封送后返回大小,   而sizeof返回公共分配的大小   语言运行时,包括任何填充。

我怀疑它是因为结构内的填充物。您已允许.NET按顺序布局结构。这当然可以让它猜测某些事情。我会使用明确设置打包值,甚至可能大小值。