通过引用将字段传递到非托管代码中安全吗

本文关键字:非托管代码 安全 引用 字段 | 更新日期: 2023-09-27 17:58:09

通过引用将字段传递到非托管外部方法中安全吗?

[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);
    }
}

通过引用将字段传递到非托管代码中安全吗

p/Invoke将在调用期间固定refout传递的直接参数。它们将以指针的形式显示在非托管端。

只要非托管代码不保存指针以备将来使用,你就可以了。如果它会保存指针以供将来使用,那么你需要使用GCHandle.Alloc(Pinned)来固定它,直到"稍后"的意思出现为止。