Влияет ли try-catch на потоки, COM-объекты и возвращаемые данные свойств - PullRequest
0 голосов
/ 09 мая 2020

Общие сведения: я пытаюсь предложить автоматизацию Outlook без ссылки на Interop dll. Это сделано для того, чтобы упростить установку для клиентов без необходимости устанавливать или ссылаться на библиотеки DLL в определенных c папках для инструмента.

Я НЕ пишу всеобъемлющее программное обеспечение / инструмент. Поэтому я не могу повлиять на атрибуты STA / MTA. Это стороннее программное обеспечение, которое позволяет добавлять фрагменты кода для формирования базового c класса и методов et c ....

  1. Если мы используем 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;
    }
    
  2. Если мы удалим ссылку 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;  
    }
    }
    
  3. Когда приведенный выше фрагмент заключен в простой блок try-catch , работает каждый раз. Обратите внимание, что нет никаких других различий в коде / объектах / экземпляре или даже в деталях электронной почты. Добавление try-catch заставляет его работать - каждый раз. Удалите try-catch, и он каждый раз терпит неудачу.

Итак, вопрос в том, почему это так, и могу ли я уверенно подписать завершение кода с помощью блока try catch?

Это связано с тем, что поток, возвращающийся из вызова COM, заключен в try-catch, который заставляет вызов возвращаться с результатами?

Я недостаточно знаком с внутренней работой COM, поэтому попытался найти несколько старых потоков, и есть подсказка о потоковой передаче, COM и привязке во время выполнения. Но, похоже, никто не упоминает об этой простой проблеме, связанной с попыткой «исправить» все.

...