c# - 从托管代码调用 Folder.PropertyAccessor 是否安全?

标签 c# .net outlook vsto outlook-addin

我们最近完成了 VSTO Outlook 加载项的开发。对于某些配置数据,它在 Folder 上使用自定义 olText 属性.

当我们的加载项检测到这些属性不可用时,它会使用 Folder 的 UserDefinedProperties 属性来 Find/Add我们的自定义属性(如果它们不存在)。

if (folder.UserDefinedProperties.Find(propertyName) == null)
    folder.UserDefinedProperties.Add(propertyName, OlUserPropertyType.olText);

当我们的加载项运行时,我们多次获取和设置这些属性。我们使用 PropertyAccessor GetProperty 和 SetProperty 方法来做到这一点。同样,我们所有的属性都是 OlUserPropertyType.olText 类型。此外,我们总是在获取和设置属性时分派(dispatch)到 Outlook 的 UI 线程。

//set
string value = "blah";
folder.PropertyAccessor.SetProperty(GetSchemaName(propertyName), value);

// get
string value = folder.PropertyAccessor.GetProperty(GetSchemaName(propertyName)

GetSchemaName 返回(“http://schemas.microsoft.com/mapi/string/”+ assemblyGuid +“/”+ propertyName)。

但是,我们在文件夹的 PropertyAccessor 上使用 GetProperty 和 SetProperty 会导致频繁的运行时 COMExceptions。下面是调用 GetProperty 的异常示例。我们在 Outlook 2010 和 2013 中都看到了这个问题。

System.Runtime.InteropServices.COMException (0x80020005): Type mismatch.
(Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))
at Microsoft.Office.Interop.Outlook._PropertyAccessor.GetProperty(String SchemaName)

我的问题是:使用 Folder PropertyAccessor 在 VSTO 中获取和设置属性是否存在已知问题?如果不是,为什么会这样?

最佳答案

不,这不是已知问题。

GetSchemaName(propertyName)

传递给 Get/SetProperty 方法的实际值是多少?

无论如何,我建议改用 StorageItem 类。以下是 MSDN 的声明:

GetStorage 方法使用 StorageIdentifier 指定的标识符获取 Folder 对象上的 StorageItem,并具有 StorageIdentifierType 指定的标识符类型。 StorageItem 是 Folder 中的隐藏项,它随帐户漫游,在线和离线都可用。

如果您使用 StorageIdentifierType 的 olIdentifyByEntryID 值指定 StorageItem 的 EntryID,则 GetStorage 方法将返回具有指定 EntryID 的 StorageItem。如果使用该 EntryID 找不到 StorageItem,或者如果 StorageItem 不存在,则 GetStorage 方法将引发错误。

如果您使用 StorageIdentifierType 的 olIdentifyByMessageClass 值指定 StorageItem 的消息类别,则 GetStorage 方法将返回具有指定消息类别的 StorageItem。如果有多个项目具有相同的消息类别,则 GetStorage 方法返回具有最新 PR_LAST_MODIFICATION_TIME 的项目。如果不存在具有指定消息类的 StorageItem,则 GetStorage 方法会使用 StorageIdentifier 指定的消息类创建一个新的 StorageItem。

如果您指定 StorageItem 的主题,则 GetStorage 方法将返回带有在 GetStorage 调用中指定的主题的 StorageItem。如果有多个项目具有相同的主题,则 GetStorage 方法将返回具有最近 PR_LAST_MODIFICATION_TIME 的项目。如果不存在具有指定主题的 StorageItem,则 GetStorage 方法将使用 StorageIdentifier 指定的主题创建一个新的 StorageItem。

使用 GetStorage Folder 类的方法获取父 Folder 上的 StorageItem 对象以存储 Outlook 解决方案的数据。

参见 Storing Data for Solutions获取更多信息。

关于c# - 从托管代码调用 Folder.PropertyAccessor 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28629656/

相关文章:

c# - Identity Server 4 - 未经授权的客户端

c# - 如何在 ASP.NET C# 中接收多部分 POST 数据请求?

c# - FileUpload 控件生成空文件

c# - 获取 .Net XML 文档以返回字典的特定类型

excel - 使用 VBA 从 Outlook 2010 保存 .XLSX 附件

c# - WPF Web浏览器故障

c# - 控制台与 WebAPI 中共享类库的 MediatR 设置

c# - 如何使用Reflection调用 "private async Task"类型的方法

html - 我可以检测 outlook 客户端并更改我的 html 电子邮件的样式吗?

excel - 将电子邮件详细信息从 Outlook 导出到 Excel