簡體   English   中英

"如何在 C# 中固定指向托管對象的指針?"

[英]How to pin a pointer to managed object in C#?

非托管代碼調用我的函數。 在第一個函數中,我應該將指針傳回我的托管對象。 有時稍后我的一些其他函數會使用與參數之一相同的指針來調用。 我應該取消引用它並使用它來執行一些計算,然后如果不需要它就將其處理掉。 簡而言之,我需要固定該對象,以便 GC 在我處理它之前不會移動它。 如何在 C# 中做到這一點? 提前致謝。

要在C#中固定對象,可以將GCHandle.Alloc方法與第二個參數GCHandleType.Pinned 在使用GCHandle.Free方法釋放GCHandle實例之前,對象仍保持固定狀態。

(大約 2022 年,Dotnet 6)

另一個答案不適用於托管對象。 在運行時它將失敗。 這是將按要求執行的代碼。

public static class Pin
{

    /// <summary>
    /// use to obtain raw access to a managed object.  allowing pinning.
    /// <para>
    /// Usage:<code>fixed (byte* data = [AND_OPERATOR]GetRawObjectData(managed)){  }</code>
    /// </para>
    /// </summary>
    public static ref byte GetRawObjectData(object o)
    {
        //usage:  fixed (byte* data = &GetRawObjectData(managed)) { }
        return ref new PinnableUnion(o).Pinnable.Data;
    }

    [StructLayout(LayoutKind.Sequential)]
    sealed class Pinnable
    {
        public byte Data;
    }

    [StructLayout(LayoutKind.Explicit)]
    struct PinnableUnion
    {
        [FieldOffset(0)]
        public object Object;

        [FieldOffset(0)]
        public Pinnable Pinnable;

        public PinnableUnion(object o)
        {
            System.Runtime.CompilerServices.Unsafe.SkipInit(out this);
            Object = o;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM