我们最近完成了VSTO Outlook加载项的开发。对于某些配置数据,它使用Folder上的自定义olText属性。
当我们的加载项检测到这些属性不可用时,它会将文件夹的UserDefinedProperties属性用于Find/Add我们的自定义属性(如果它们不存在)。
if (folder.UserDefinedProperties.Find(propertyName) == null)
folder.UserDefinedProperties.Add(propertyName, OlUserPropertyType.olText);
当我们的加载项正在运行时,我们多次获取并设置这些属性。我们使用PropertyAccessor GetProperty和SetProperty方法来做到这一点。同样,我们所有的属性都是类型OlUserPropertyType.olText。此外,当我们获取并设置属性时,我们总是会调度到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)。
但是,我们在Folder的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中获取和设置属性是否存在已知问题?如果没有,为什么会发生这种情况?
答案 0 :(得分:1)
不,这不是一个已知问题。
GetSchemaName(propertyName的)
传递给Get / SetProperty方法的实际值是什么?
无论如何,我建议改用StorageItem类。这是MSDN所说的:
GetStorage方法使用StorageIdentifier指定的标识符获取Folder对象上的StorageItem,并具有StorageIdentifierType指定的标识符类型。 StorageItem是文件夹中的隐藏项目,与帐户一起漫游,可在线和离线使用。
如果通过使用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的Subject,则GetStorage方法将返回带有GetStorage调用中指定的Subject的StorageItem。如果有多个具有相同主题的项目,则GetStorage方法将返回具有最新PR_LAST_MODIFICATION_TIME的项目。如果指定的Subject没有StorageItem,则GetStorage方法将创建一个新的StorageItem,其中Subject由StorageIdentifier指定。
使用Folder类的GetStorage方法获取父文件夹上的StorageItem对象,以存储Outlook解决方案的数据。
有关详细信息,请参阅Storing Data for Solutions。
答案 1 :(得分:1)
您最终在文件夹上设置了命名的MAPI属性。请记住,虽然PST提供商支持,但Exchange提供商不支持。您需要重新考虑将属性存储在文件夹本身上的需要,或者在文件夹中的隐藏(关联)消息上设置此类属性。这就是MAPIFolder.GetStorage使用的内容,也就是Outlook如何存储自己的每个文件夹设置(例如视图)。在OutlookSpy中查看现有数据(收件箱是一个很好的候选者)(单击IMAPIFolder,转到“关联内容”选项卡。