0

我正在围绕使用不透明指针来识别资源的本机 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)。

那么从静态字典中删除条目的正确方法是什么?我正在编写库代码,不能依赖我的客户来处理我的对象。我应该把代码放在终结器中吗?

或者有没有更好的方法来管理静态回调和我的对象实例之间的对应关系?

4

1 回答 1

1

您的客户确实应该(实际上我更愿意说must)处置您的对象,因为它们是IDisposable,就像他们对其他 BCL 类所做的那样。

在任何情况下,dispose/finalize 模式的标准实现应该涵盖所有基础。这里有更多相关的讨论。

于 2013-01-22T15:16:28.590 回答