Общие сведения: я пытаюсь предложить автоматизацию Outlook без ссылки на Interop dll. Это сделано для того, чтобы упростить установку для клиентов без необходимости устанавливать или ссылаться на библиотеки DLL в определенных c папках для инструмента.
Я НЕ пишу всеобъемлющее программное обеспечение / инструмент. Поэтому я не могу повлиять на атрибуты STA / MTA. Это стороннее программное обеспечение, которое позволяет добавлять фрагменты кода для формирования базового c класса и методов et c ....
Если мы используем Interop dll reference и Early binding, то следующие строки работают нормально:
if(item.SenderEmailType == "EX") {
Microsoft.Office.Interop.Outlook.AddressEntry entry = (Microsoft.Office.Interop.Outlook.AddressEntry)item.Sender;
Microsoft.Office.Interop.Outlook.ExchangeUser user = (Microsoft.Office.Interop.Outlook.ExchangeUser)entry.GetExchangeUser();
row["SenderEmailAddress"] = user.PrimarySmtpAddress;
} else {
row["SenderEmailAddress"] = item.SenderEmailAddress;
}
Если мы удалим ссылку dll и используем ключевое слово Dynami c, этот фрагмент кода никогда не будет работать, где 'item' на самом деле является одним из Microsoft.Office.Interop.Outlook.MailItem, полученным с помощью метода Items.Restrict:
foreach(dynamic item in folderItems) {
if(item.SenderEmailType == "EX") {
dynamic entry = item.Sender;
// the object is always null, as it seems that runtimebinding is not happening properly?
dynamic user = entry.GetExchangeUser();
// perhaps the COM Object has to attempt to call Outlook, and the info is never returned on the same thread??
row["SenderEmailAddress"] = user.PrimarySmtpAddress;
} else {
// this is OK, as it seems that SenderEmailAddress property data is delivered with the COM Object first time around
row["SenderEmailAddress"] = item.SenderEmailAddress;
}
}
- Когда приведенный выше фрагмент заключен в простой блок try-catch , работает каждый раз. Обратите внимание, что нет никаких других различий в коде / объектах / экземпляре или даже в деталях электронной почты. Добавление try-catch заставляет его работать - каждый раз. Удалите try-catch, и он каждый раз терпит неудачу.
Итак, вопрос в том, почему это так, и могу ли я уверенно подписать завершение кода с помощью блока try catch?
Это связано с тем, что поток, возвращающийся из вызова COM, заключен в try-catch, который заставляет вызов возвращаться с результатами?
Я недостаточно знаком с внутренней работой COM, поэтому попытался найти несколько старых потоков, и есть подсказка о потоковой передаче, COM и привязке во время выполнения. Но, похоже, никто не упоминает об этой простой проблеме, связанной с попыткой «исправить» все.