我在C++中有一个带有两个参数的方法:字节和ushort,它返回指向非常困难的结构的指针(它是C++项目中几乎所有结构的联合)。
当我在C#中使用C#调用此方法时,例如传递它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;(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(新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现在画面已经满了。
发布于 2012-02-09 14:36:54
在寻求我们的帮助之前,你显然需要更多的信息。看看这篇文章:http://msdn.microsoft.com/en-us/library/eahchzkf(v=vs.100).aspx注意到了所做的声明。
虽然可以使用Marshal.SizeOf方法,但此方法返回的值并不总是与sizeof返回的值相同。Marshal.SizeOf在对类型进行封送后返回大小,而size返回由公共语言运行库分配的大小,包括任何填充。
我怀疑这是因为结构内部的填充。您已经允许.NET按顺序布局结构。当然,这允许它猜测某些事情。我将使用显式设置包值,甚至大小值。
https://stackoverflow.com/questions/9210343
复制相似问题