C# 获取托管结构的地址

C# 获取托管结构的地址,c#,pointers,structure,C#,Pointers,Structure,(我正在用C#编写代码) 我想通过API传递指向结构的指针。 说结构是, [StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)] public struct PassThisStruct { public Int32 Param1; public Int32 Param2; [MarshalAs(UnmanagedType.ByValArr

(我正在用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);
i、 我想把结构指针传递给结构

我为这个API做了一个委托,然后从DLL中检索地址并将其存储在函数指针中。 但当我尝试编译时,它在委托声明中给了我错误,“无法获取托管空间的地址、大小或声明指向托管空间的指针”

那么应该如何传递指针呢? 我知道我可以使用“REF”,但是这个API是用C++编写的,它需要一个结构指针。若我使用ref,我就不能传递Null,而且我也会得到错误“AccessViolationException”(这对我来说是一个更大的问题!)。因此,只有当我能够摆脱AccessViolationException时,我才会使用ref

还有一个问题,在这种情况下我能传递Null吗??如果是,如何进行


问候

我看到您正在起诉常量字符数组。因此,我将把这个结构改写为:

  [StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)]
  public unsafe struct PassThisStruct
    {
       public Int32 Param1;
       public Int32 Param2;
       public fixed char OutputData[3];
    };
(一) 然后我将使用IntPtr ptr=Marshal.StructureToPtr(…)

(二) 我没有试过,但我认为你可以:

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

     myAPI(12, sPtr);
  }

我知道你在起诉常量字符数组。因此,我将把这个结构改写为:

  [StructLayout(LayoutKind.Sequential,CharSet= CharSet.Ansi)]
  public unsafe struct PassThisStruct
    {
       public Int32 Param1;
       public Int32 Param2;
       public fixed char OutputData[3];
    };
(一) 然后我将使用IntPtr ptr=Marshal.StructureToPtr(…)

(二) 我没有试过,但我认为你可以:

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

     myAPI(12, sPtr);
  }

我关于“AccessViolationException”的问题:我不明白你为什么会出现这个错误。没有使用“托管”类型。可能是
ByValArray
引起了问题。还要确保
结构
固定的
或局部变量。您所说的
委托声明
是什么意思?我在你的代码中没有看到这样的东西。我的坏。。。。API声明为委托(已更正)。我可以理解“还要确保结构是固定的或是局部变量”我关于“AccessViolationException”的问题:我不明白为什么你会出现这个错误。没有使用“托管”类型。可能是
ByValArray
引起了问题。还要确保
结构
固定的
或局部变量。您所说的
委托声明
是什么意思?我在你的代码中没有看到这样的东西。我的坏。。。。API声明为委托(已更正)。我可以理解,“还要确保结构是固定的或是局部变量”