PInvoke addressing

PInvoke addressing

本文关键字:addressing PInvoke      更新时间:2023-10-16

我在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。

为什么一个字节的大小不同?上升

现在我的函数是(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

现在图片已满。

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

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

我怀疑是因为结构中有填充物。您已允许.NET对结构进行顺序布局。这当然允许它对某些事情进行猜测。我会使用Explicit设置Pack值,甚至可能使用Size的值。