C# 在Citrix上执行时,mailItem上的SetProperty/GetProperty无法按预期工作
我有一个Outlook VSTO插件 我使用C# 在Citrix上执行时,mailItem上的SetProperty/GetProperty无法按预期工作,c#,outlook,vsto,outlook-addin,citrix,C#,Outlook,Vsto,Outlook Addin,Citrix,我有一个Outlook VSTO插件 我使用mailItem.PropertyAccessor.SetProperty()和mailItem.PropertyAccessor.GetProperty()来保存和检索有关邮件项目的一些信息。它工作得很好 但是,当在Citrix环境上执行(并且仅当)时,SetProperty不会抛出任何错误,并且GetProperty的行为就像不存在任何属性一样。所以我没有任何错误 知道如何解决此问题吗?如果仅用于内部目的,而不需要保存,请不要设置属性-这可能会造成
mailItem.PropertyAccessor.SetProperty
()和mailItem.PropertyAccessor.GetProperty
()来保存和检索有关邮件项目的一些信息。它工作得很好
但是,当在Citrix环境上执行(并且仅当)时,SetProperty
不会抛出任何错误,并且GetProperty
的行为就像不存在任何属性一样。所以我没有任何错误
知道如何解决此问题吗?如果仅用于内部目的,而不需要保存,请不要设置属性-这可能会造成不良影响:项目变脏,浪费属性映射(每个邮箱最多可以有0xFFFF命名属性-一旦达到限制,邮箱几乎死机)
创建一个包装类,将
MailItem
对象作为属性以及一个列表、一个字典或一组显式属性来保存每个项目的临时数据。因此GetProperty总是抛出异常?GetProperty
抛出异常,就像未使用SetProperty
一样(默认行为是在未设置的情况下抛出,并捕获以将其视为默认)您真的可以在OutlookSpy中看到属性吗(-单击IMessage按钮)?另外,您是否记得调用MailItem。调用SetProperty后保存?实际上,我不想保存邮件项目(因为它会将其保存为草稿)。在其他环境中(这不使用Citrix),它工作得很好。我在某处看到,这可能是因为使用了Exchange缓存模式,但还不确定是否使用了它。我将深入研究这一线索。它似乎过于复杂,因为这个包装类应该处理邮件项的生命周期(创建和删除)为了避免内存泄漏。除此之外,即使我不需要对这些属性进行“冷保存”,我也不能100%确定MailItem引用不会改变uppon的使用情况(如果用户隔离窗口,或者用户总是发现的任何其他用例…),关于0xFFFF(65536)限制,我认为我们离这真的很远:-)我设法解决了这个问题,使用了一个受您启发的解决方案,使用了一个包含我所有属性的静态条件weaktable mailItemsProperties
。通过弱引用管理mailItems生命周期的条件weaktable
。谢谢!