Позвольте мне предисловие, сказав, что я не работаю с офисным COM-объектом и вообще стараюсь избегать его, как чуму. Я также знаю, что этот вопрос был доведен до смерти в отношении доступа к файлам.pst, однако после часа поиска в Google я еще не нашел много о.ost.
Я пытаюсь обновить метод в существующем приложении, приложение обращается к PST файлу и получает список имен контактов и электронных писем, которые будут использоваться в реализации автозаполнения. Недавно мы изменили с прямого IMAP-сервера Host Email на Microsoft Exchange, который изменяется с.pst на.ost файл
Это метод:
var arrName = new List<string>();
var arrEmail = new List<string>();
try
{
var outlookApplication = new ApplicationClass();
NameSpace mapiNamespace = outlookApplication.GetNamespace("MAPI");
MAPIFolder contacts = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
for (int i = 1; i < contacts.Items.Count + 1; i++)
{
var contact = (ContactItem) contacts.Items[i];
arrName.Add(contact.FullName);
arrEmail.Add(contact.Email1Address);
}
Global.ConName = arrName.ToArray();
Global.ConEmail = arrEmail.ToArray();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
//Error Logging
}
Когда вызов вызывает следующую ошибку:
System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to
interface type 'Microsoft.Office.Interop.Outlook.ContactItem'.
This operation failed because the QueryInterface call on the COM
component for the interface with IID '{00063021-0000-0000-C000-000000000046}'
failed due to the following error:
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
at OPUSfin.LoginMain.GetEmailContactsFromOutlook() in PATH:line 81
Может ли кто-нибудь указать мне в правильном направлении, как я могу изменить это, чтобы работать с реализацией Exchange?
Спасибо
Ссылка: доступ к Outlook ost file Вопрос
Вы можете иметь объекты DistListItem, кроме ContactItem, которые ожидают ваш код.
Используйте оператор "как", чтобы проверить, действительно ли у вас объект ContactItem. Вы также можете кэшировать коллекцию Items перед входом в цикл:
Items items = contacts.Items;
for (int i = 1; i <= items.Count; i++)
{
ContactItem contact = items[i] as ContactItem;
if (contact !=null)
{
...
}
}