问题在于处理未经管理的资源(COM interop),并确保任何资源泄漏。 我很赞赏对我是否以正确方式行事的反馈意见。
Background:
请允许我说,我有两个班子:
a 类别<代码>LimitedComResource,该类别围绕一个COM标(通过一些APIC获得)。 只有为数有限的这些COM物体,因此,我的班子实施<代码>。 IDisposable cross which will be responsible for releaseing a COM Object when it s no term need.
另一种类型的物体:
ManagedObject
暂时创建,以便在上做一些工作。 LimitedComResource
。 页: 1 IDisposable。
为了用图表总结上述内容,我的班子可能这样做:
+---------------+ +--------------------+
| ManagedObject | <>------> | LimitedComResource |
+---------------+ +--------------------+
|
o IDisposable
(我仅举一个例子,说明这两个班的代码。)
Question:
自我的临时<代码>以来 目标代码>物体不可弃置,我显然无法控制其残ll多久。 然而,与此同时,我可能还有<代码>Disposed>,LimitedComObject
: a ManagedObject
。 www.un.org/Depts/DGACM/index_french.htm ......
+---------------+ +--------------------+
| managedObject | <>------> | (dead object) |
+---------------+ +--------------------+
我目前正在实施这一规定时,在<条码>中,有各种参考文献软弱和旗帜,表明某一物体是否已经处置。Is there any better way?
Example code (what I ve currently got):
LimitedComResource
:
class LimitedComResource : IDisposable
{
private readonly IUnknown comObject; // <-- set in constructor
...
void Dispose(bool notFromFinalizer)
{
if (!this.isDisposed)
{
Marshal.FinalReleaseComObject(comObject);
}
this.isDisposed = true;
}
internal bool isDisposed = false;
}
ManagedObject
:
class ManagedObject
{
private readonly WeakReference limitedComResource; // <-- set in constructor
...
public void DoSomeWork()
{
if (!limitedComResource.IsAlive())
{
throw new ObjectDisposedException();
// ^^^^^^^^^^^^^^^^^^^^^^^
// is there a more suitable exception class?
}
var ur = (LimitedComResource)limitedComResource.Target;
if (ur.isDisposed)
{
throw new ObjectDisposedException();
}
... // <-- do something sensible here!
}
}