获取管理结构的地址

时间:2010-10-25 11:43:11

标签: c# pointers structure

(我用C#编码)

我想通过API传递指向结构的指针。 说结构是,

 [StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)]
      public struct PassThisStruct
        {
           public Int32 Param1;
           public Int32 Param2;
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=13)]
           public Char[] OutputData;

        };

现在API声明是: -

unsafe public delegate Int32 MyAPI(Int16 Something, PassThisStruct* StructPtr);

即。我想将Structure指针传递给Structure。

我为此API创建了一个委托,然后从DLL中重新获取地址并将其存储在Function Pointer中。 但是当我尝试编译时,它在委托声明中给出了错误,“不能获取地址,获取大小,或者声明指向托管空间的指针”。

那么应该如何传递指针呢? 我知道我可以使用“ref”,但这个API是用C ++编写的,它需要一个结构指针。如果我使用ref我无法传递Null,我也会收到错误“AccessViolationException”(这对我来说是一个更大的问题!)。所以只有在我能摆脱AccessViolationException时才会使用ref。

还有一个问题,我可以在这种情况下通过Null吗?如果是,如何?

问候!

1 个答案:

答案 0 :(得分:1)

我看到你正在起诉常量的char数组。所以我会把这个结构重写为:

  [StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)]
  public unsafe struct PassThisStruct
    {
       public Int32 Param1;
       public Int32 Param2;
       public fixed char OutputData[3];
    };

1)        然后我会使用IntPtr ptr = Marshal.StructureToPtr(...);

   unsafe public delegate Int32 MyAPI(Int16 Something, PassThisStruct* StructPtr) would change to:
   public delegate Int32 MyAPI(Int16 Something, IntPtr StructPtr)

2)       我没有尝试,但我认为你可以这样做:

  unsafe void MyMethod()
  {
     PassThisStruct s = new PassThisStruct();
     PassThisStruct* sPtr = (PassThisStruct*)s;

     myAPI(12, sPtr);
  }