我在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
现在图片已满。
答案 0 :(得分:0)
在您请求我们的帮助之前,您显然需要更多信息。看一下这篇文章:http://msdn.microsoft.com/en-us/library/eahchzkf(v=vs.100).aspx注意所做的陈述。
虽然您可以使用Marshal.SizeOf方法,但返回的值 此方法并不总是与sizeof返回的值相同。 Marshal.SizeOf在类型被封送后返回大小, 而sizeof返回公共分配的大小 语言运行时,包括任何填充。
我怀疑它是因为结构内的填充物。您已允许.NET按顺序布局结构。这当然可以让它猜测某些事情。我会使用明确设置打包值,甚至可能大小值。