通过引用将字段传递给非托管的extern方法是否安全?
[StructLayout(LayoutKind.Sequential)]
struct SomeStruct
{
public int SomeValue;
}
class SomeClass
{
SomeStruct _someStruct;
[DllImport("SomeLibrary.dll")]
static extern void SomeExternMethod(ref SomeStruct someStruct);
public void SomeMethod()
{
// Is this safe or do I have to pin the current instance of SomeClass?
SomeExternMethod(ref _someStruct);
}
}
答案 0 :(得分:6)
P / Invoke将在调用期间直接引用由ref
或out
,传递的参数。它们将作为指针显示在非管理方面。
只要非托管代码没有保存指针以供日后使用,您就可以了。如果它将保存指针以供日后使用,那么您需要使用GCHandle.Alloc(Pinned)
将其固定,直到"稍后"装置