1

我正在从 C# 调用本机 dll。对于有问题的特定函数,我需要的参数之一是一个包含双重间接字段(指向指针的指针)的结构。

例如,采用以下 C 原型和结构:

int someFunc(SomeStruct* result);

struct SomeStruct
{
     DWORD foo;
     AnotherStruct** ppResultStruct;
}

struct AnotherStruct
{
     DWORD bar;
}

以下 C# 代码只为字段 AnotherStruct 提供了一个间接级别,这是不正确的:

[DllImport("my.dll")]
public static extern int someFunc(SomeClass result);

[StructLayout(LayoutKind.Sequential)
public class SomeClass
{
    int foo;
    AnotherClass resultClass;
}

[StructLayout(LayoutKind.Sequential)]
public class AnotherClass
{
    int bar;
}

如何实现此处所需的双重间接?我知道在函数的双重间接参数的情况下如何做到这一点,但我对它嵌入在结构中的事实感到困惑。

也许我应该将 AnotherClass 字段声明为 IntPtr,然后使用不安全代码为其分配适当的值。这是一种有效的方法,还有其他/更好的选择吗?

4

1 回答 1

4

如果没有自定义 marashaler,您将无法构建既包含标准内联结构定义又包含双重间接的类。这种类型的编组需要一点魔法才能实现。

解决此问题的最佳方法是将双重间接视为实际的指针。然后用漂亮的属性来照顾邪恶

[StructLayout(LayoutKind.Sequential)
public class SomeClass
{
    int foo;
    IntPtr resultPtr;
    AnotherStruct resultStruct { 
      get { 
        var temp = (IntPtr)Marshal.PtrToStructure(resultPtr, typeof(IntPtr));
        return (AnotherStruct)Marshal.PtrToStructure(temp, typeof(AnotherStruct));
      }
    }

}

[StructLayout(LayoutKind.Sequential)]
public class AnotherStruct
{
    int bar;
}
于 2009-06-03T21:19:43.850 回答