(我用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吗?如果是,如何?
问候!
答案 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);
}