PInvoke addressing
PInvoke addressing
我在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的值。
- 我无法从 C# 获取 PInvoke 的输入参数以C++ DLL 以用作 IntPtr 的输出
- 在Mono-Pinvoke中尝试使用本机C++时未定义的符号
- 如何修复"方法的类型与 PInvoke 不兼容"
- C++互操作(隐式 PInvoke)的限制
- PINVOKE字节阵列从C 到C#
- 第二个值在 pinvoke 期间未传递给C++函数
- 将带有结构字段的结构从C 返回到C#PINVOKE
- 从 C# 到通过 PInvoke C++的简单结构中的垃圾数据
- 带有指针到指针参数的 PInvoke 函数
- 如何在C#中PInvoke另一个结构中的结构数组
- 无法为extern c int _clrcall生成pinvoke ..呼叫元数据中缺少的约定
- C#调用C 第三方DLL(无源)提出异常 - 不兼容PinVoke
- PInvoke "Attempted to read or write protected memory"
- AOT问题,消息"正在Xamarin iOS上尝试使用Pinvoke JIT编译方法"
- 是否更正PInvoke签名以使用带有C#保留内存的嵌套结构
- C# PInvoke - 返回 char* 和引用 char* 参数的函数
- 如何使用PINVOKE将图像从C或C 发送到C#
- Pinvoke阵列编组失败
- pinvoke c function - System.BadImageFormatException
- PInvoke addressing