[英]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.