首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PInvoke寻址

PInvoke寻址
EN

Stack Overflow用户
提问于 2012-02-09 11:51:23
回答 1查看 339关注 0票数 0

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

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

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

--更新--

在注释了C++和C#的代码结构之后,我将测试代码缩减为: C++:

代码语言:javascript
复制
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#:

代码语言:javascript
复制
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++):

代码语言:javascript
复制
__declspec(dllexport) GetRelayCfmType __stdcall GetRelay_Blocking(unsigned char InstNo, RelayNoType No)

 enum RelayNoType : unsigned char

因此,在C#中,我有:

代码语言:javascript
复制
[DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] 
    public static extern GetRelayCfmType GetRelay_Blocking(byte InstNo, RelayNoType No);

enum RelayNoType : byte

现在画面已经满了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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按顺序布局结构。当然,这允许它猜测某些事情。我将使用显式设置值,甚至大小值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9210343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档