簡體   English   中英

緩存以將IntPtr句柄映射到pinvoke回調中的C#類實例

[英]Cache to map IntPtr handles to C# class instances in pinvoke callbacks

我正在使用不透明指針標識資源的本機dll編寫C#包裝器。 一個典型的例子是

typedef struct session session;
typedef struct track track;

void* sessionCreate(int arg, session** sess);
void  sessionRelease(session** sess);
track* sessionGetTrack(session* sess, int index);
void trackAddRef(track* trk);
void trackRelease(track* trk);
int  trackGetLength(track* trk);

在我的包裝器中,我創建了與不同不透明類型相對應的C#類,並使用與不同不透明類型相對應的各種函數來創建成員函數。

這可以。 也有來自dll的回調,例如

void(* track_changed )(track *trk, bool changedExternally);

為了從處理回調的靜態委托映射到與提供的句柄相對應的對象,我在每個類中使用了WeakReferences的靜態字典(IntPtr / SafeHandle作為鍵,對象引用作為aata)。

那么從靜態字典中刪除條目的正確方法是什么? 我正在編寫庫代碼,不能依靠我的客戶來處置我的對象。 我應該將代碼放入終結器中嗎?

還是有更好的方法來管理靜態回調和我的對象實例之間的對應關系?

您的客戶確實應該 (確實,我想說必須 )處置您的對象,因為它們是IDisposable ,就像它們與其他BCL類一樣。

在任何情況下, 處理/完成模式的沼澤標准實現都應覆蓋所有基礎。 還有更多的相關討論在這里

暫無
暫無

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

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