我的WPF Windows C#应用程序存在一些问题。每当应用程序关闭时,它都会抛出System.ObjectDisposedException
。问题似乎只发生在32位编译时。 64位版本运行正常,没有任何异常。
从异常消息中,它表示无法访问已处置的对象,但它似乎没有告诉导致问题的对象 - 如何找出已处置的对象?
异常:抛出:"无法访问已处置的对象。" (System.ObjectDisposedException) 抛出了System.ObjectDisposedException:"无法访问已处置的对象。" 时间:2016年1月19日下午5:16:28 螺纹:[1552]
异常信息:System.ObjectDisposedException 堆: 在System.Diagnostics.EventLogInternal.OpenForWrite(System.String) 在System.Diagnostics.EventLogInternal.InternalWriteEvent(UInt32,UInt16,System.Diagnostics.EventLogEntryType,System.String [],Byte [],System.String) 在System.Diagnostics.EventLogInternal.WriteEntry(System.String,System.Diagnostics.EventLogEntryType,Int32,Int16,Byte []) 在System.Diagnostics.EventLog.WriteEntry(System.String,System.Diagnostics.EventLogEntryType) 在HP.HPTRIM.SDK.TrimApplicationBase.UnregisterStackTrace(System.Object,Int32) 在HP.HPTRIM.SDK.Database.internal_Dispose() 在HP.HPTRIM.SDK.Database.Finalize()
答案 0 :(得分:2)
这可能为时已晚,无法使用,但我偶然发现了这一点,因为我最近在使用HP Records Manager SDK(在我的情况下为v8.3)时遇到了一个非常相似(相同的?)问题。我相信我已经确定了原因。
我自己的代码中存在一个错误(使用HP .Net SDK连接到HPRM的可执行文件),我没有在其中一个SDK对象上调用Dispose()
。
似乎当GC
随着可执行文件退出而清理时,HP决定要将消息写入Windows应用程序事件日志,指出开发人员忘记了.Dispose()
正确的对象。但无论出于何种原因,HP SDK中似乎也存在一个错误,此时它已经处理了内部系统以写入事件日志。 (有时它适用于我,有时不适用。可能是SDK中某处的竞争条件。)
结果是,在我的代码结束后,.Net Framework跳了起来,尖叫着HP SDK尝试使用已处置的对象写入事件日志。
我的直接修复是修复自己的代码。一旦我处理了我想要的所有对象(特别是我创建的数据库连接),事件链就没有被启动。但实际上,HP代码似乎也有问题。
答案 1 :(得分:0)
如果查看堆栈跟踪的最后一行,您将看到问题是由HP.HPTRIM.SDK.Database
对象的Dispose()引起的。
答案 2 :(得分:0)
这不是一个答案,因为在评论中提供有用的时间太长了。
我在ILSpy
看了EventLog
课时花了一些时间。异常中最内层的方法EventLogInternal.OpenForWrite
旨在在设置其中一个内部标志时显式抛出ObjectDisposedException
。 (尽管你收到的ObjectDisposedException
总是有可能不是专门从这一行开始的,但值得注意的是。)
private void OpenForWrite(string currentMachineName)
{
if (this.boolFlags[256])
throw new ObjectDisposedException(base.GetType().Name);
...
}
仅在调用EventLog
实例的Dispose
方法时才设置它正在检查的标志,这意味着EventLog
实例正在主动处理。由于这是您无法控制的,这可能是HP TRIM的HP.HPTRIM.SDK.Database
IDisposable
实现中的错误,因为异常中列出的两个HP方法之一将保留对{{EventLog
的引用。 1}}实例。
值得注意的是,触发此异常是可能的,因为HP.HPTRIM.SDK.Database
实例在应用程序关闭期间没有正确处理(假设其IDisposable
)并且只是被允许超出范围。作为测试,您可以尝试在应用程序关闭期间处理HP.HPTRIM.SDK.Database
实例,并查看是否可以复制错误。
我不能说这与位数有什么关系。