管理结构的地址
问题描述:
(我在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);
即我想通过结构指针结构。
我为此API做了一个委托,然后从DLL中取回地址并将其存储在函数指针中。 但是,当我尝试编译时,它给我错误委托声明,“无法获取地址,获取大小或声明指向托管空间的指针”。
那么应该如何传递指针呢? 我知道我可以使用“ref”,但是这个API是用C++编写的,它需要一个结构指针。如果我使用ref,我不能传递Null,而且我也会因为“AccessViolationException”而出错(这对我来说是一个更大的问题!)。所以我会使用ref只有当我可以摆脱AccessViolationException。
还有一个问题,我可以在这种情况下通过空?如果是,如何?
问候!
答
我看到你正在启动常量字符数组。因此,我将改写这个结构为:
[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);
}
我的关于 “AccessViolationException” 问题:http://stackoverflow.com/questions/3958119/pinning-a - 结构 - 避免 - accessviolationexception – Swanand 2010-10-25 11:44:37
我不明白为什么你应该得到这个错误。没有使用“托管”类型。也许这是'ByValArray'造成的问题。还要确保'struct'是'fixed'或一个局部变量。 – leppie 2010-10-25 12:19:05
“委托申报”是什么意思?我没有看到你的代码中有这样的事情。 – leppie 2010-10-25 12:21:40