保持Excel COM对象存活

我目前正在使用Excel 2003 Interop机制来操作一些范围。 有时我将一些范围存储在我的插件中,作为类的属性,但是当我稍后尝试访问它们时,COM对象有时是随机无效的,并且COM对象的每个属性都会抛出“COMException”当我试图访问它们时。 我曾经说过Excel分配的对象和addin使用的对象之间没有强大的联系:所以Excel可以随时释放“true”Range对象,即使从.Net / C#透视图我仍然有他们的参考。 所以,我想知道是否有任何办法让我的Range对象保持活着以便以后以安全的方式使用它们? 备注:我可以使用一种解决方法,比如存储代表Ranges的字符串,例如: “A1”,而不是Ranges本身,但这会使代码不那么干净。 在此先感谢您的帮助。     
已邀请:
  我曾经说过Excel分配的对象和addin使用的对象之间没有强大的联系 这是指Excel使用“Flyweights”的事实。 Excel不在内部使用COM;它根据COM客户端(无论是外接程序,VBA还是外部应用程序)的请求,为其内部结构创建COM包装器(我将它们视为“视图”)。   ...任何时候Excel都可以释放“真正的”Range对象 我不会说“随时”。 一旦你得到一个
Range
对象或任何其他COM对象,COM对象将一直保持可用状态(在COM意义上 - 每个
AddRef()
调用
IUnknown::Release()
)。 但是,如果您持有COM对象并且底层结构不再存在,则COM对象确实变为无效。它还能做什么? 假设您持有
Range
并且用户删除Range所在的工作表。您认为应该怎么做?这不像Excel会抛出一个消息框说“对不起,你不能删除工作表,因为有些代码想要抓住它”。如果用户删除数据,Excel将遵守,并且
Range
对象必须处理。你加载项只需要为这种可能性做好准备。如果加载项提供公式,请让它们返回#REF等。 我认为无论如何都不能主动发现这一点。我检查了某处是否存在某种IsValid(myRange)方法,但我没有看到任何方法。 无论如何,它不太可能非常有用;许多命令可能会导致[windows]消息被处理,并且在代码外部发生的任何时候都可以在毫无疑问的时间运行并使您的范围无效。你真的必须在错误发生的时候抓住错误,然后适当地'发挥'。 可能你是对的。它可能“在任何时候”。但这不是随机的。有人必须去扫除范围。 顺便说一句,我不会试图超越情况。保存范围引用文本只会导致AddIn作用于用户想要的不同数据集。 “正确”的事情是“优雅地失败”。     

要回复问题请先登录注册