我已经在C#中实现了一个IDispatch接口。它又打开了一个非托管COM接口,该接口还公开了一个IDispatch接口。
~MyObject()
{
Logger.TraceDebug("About to clean up object");
CleanupObject();
}
private void CleanupObject()
{
lock (lock_so)
{
try
{
if (so != null)
{
Logger.TraceWarning("Releasing object");
Marshal.FinalReleaseComObject(so);
}
}
catch (Exception e)
{
}
so = null;
}
}我遇到的问题是,在正常执行期间调用Finalize,同时使用对象,这意味着以后尝试访问包装的接口会失败。当我删除清理代码时,代码运行良好,但当使用代码的程序退出时将失败(我没有调用应用程序的调试信息,但很可能是包装的接口尚未释放)。我对如何解决这个问题感到困惑,并认为我的理解是错误的。任何建议都将不胜感激。
该对象的初始化方式如下:
private void InitialiseObject()
{
if (so == null)
{
so = Activator.CreateInstance(Type.GetTypeFromProgID("MyProgID));
}
}然后像这样使用:
public void DoSomething(string String)
{
try
{
lock (lock_so)
{
Object[] args = new Object[1];
args[0] = String;
so.GetType().InvokeMember("DoSomething", BindingFlags.InvokeMethod, null, so, args);
}
}所有这一切的要点是,c#接口充当传递类,并且能够记录从第三方应用程序传递到IDispatch接口的信息。
发布于 2012-03-06 02:04:59
你为什么需要这个?如果我知道你和我会有一个dispose方法来释放一些资源,那么我会实现IDisposable接口。Pattern
https://stackoverflow.com/questions/9571519
复制相似问题