C# 通过引用将字段传递到非托管代码是否安全?

C# 通过引用将字段传递到非托管代码是否安全?,c#,.net,pinvoke,C#,.net,Pinvoke,通过引用将字段传递到非托管外部方法是否安全 [StructLayout(LayoutKind.Sequential)] struct SomeStruct { public int SomeValue; } class SomeClass { SomeStruct _someStruct; [DllImport("SomeLibrary.dll")] static extern void SomeExternMethod(ref SomeStruct some

通过引用将字段传递到非托管外部方法是否安全

[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将在调用期间固定由
ref
out
传递的直接参数。它们将作为指针显示在非托管端


只要非托管代码不为以后保存指针,就可以了。如果它将保存指针以备以后使用,则需要使用
GCHandle.Alloc(pinted)
将指针固定到“later”表示的任何时候。

p/Invoke将在调用期间固定由
ref
out
传递的直接参数。它们将作为指针显示在非托管端


只要非托管代码不为以后保存指针,就可以了。如果它将保存指针以备以后使用,那么您需要使用
GCHandle.Alloc(pinted)
将其锁定,直到“later”的意思出现。

我查看了IL代码,它似乎使用了对字段的直接引用,这将支持我必须锁定它的想法。不过我想确定一下。这和传递任何其他变量没有什么区别。我看了一下IL代码,它似乎使用了对字段的直接引用,这将支持我必须固定它的想法。不过我想确定一下,这和传递其他变量没有什么区别