Проверка, установлен ли outlook с обработкой исключений в C # - PullRequest
3 голосов
/ 20 марта 2012

У меня есть раздел моего приложения, который позволяет людям отправлять электронные письма сгенерированного текста.Моя текущая проблема заключается в том, что когда они загружают форму с текстом, она генерирует необработанное исключение System.IO.FileNotFound, когда у пользователя не установлен outlook.При загрузке формы я пытаюсь определить, установлен ли у них outlook.

try{
       //Assembly _out = Assembly.Load("Microsoft.Office.Interop.Outlook");
       Assembly _out = Assembly.Load("Microsoft.Office.Interop.Outlook, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c");
       //Microsoft.Office.Interop.Outlook.Application _out = new Microsoft.Office.Interop.Outlook.Application();
       //Microsoft.Office.Interop.Outlook.Application _out = new Microsoft.Office.Interop.Outlook.Application();
   }

Выше приведен код, который я пробовал.На компьютере, на котором я работаю, если имя сборки не указано, операторы catch будут его ловить.Однако, когда я тестирую его на машине с XP без внешнего вида, он выдает ошибку и останавливает загрузку событий формы.

Каждый оператор catch, который я пробовал (Catch all, даже не работал):

        catch (System.IO.FileLoadException)
        { _noOutlook = true; type = "FILE-LOAD"; }
        catch (System.IO.FileNotFoundException)
        { _noOutlook = true; type = "FILE-NOT-FOUND"; }
        catch (System.IO.IOException)
        { _noOutlook = true; type = "IO"; }
        catch (System.Runtime.InteropServices.COMException)
        { _noOutlook = true; type = "INTEROP"; }
        catch (System.Runtime.InteropServices.InvalidComObjectException)
        { _noOutlook = true; type = "INTEROP-INVALIDCOM"; }
        catch (System.Runtime.InteropServices.ExternalException)
        { _noOutlook = true; type = "INTEROP-EXTERNAL"; }
        catch (System.TypeLoadException)
        { _noOutlook = true; type = "TYPELOAD"; }
        catch (System.AccessViolationException)
        { _noOutlook = true; type = "ACCESVIOLATION"; }
        catch (WarningException)
        { _noOutlook = true; type = "WARNING"; }
        catch (ApplicationException)
        { _noOutlook = true; type = "APPLICATION"; }
        catch (Exception)
        { _noOutlook = true; type = "NORMAL"; }

Я ищу способ, который будет работать (надеюсь, так что я мог бы использовать один код для работы с Outlook 2010 и 2007) без проверки реестра / точного пути к файлу.

Вот несколько вещей, которые меня интересуют: почему XP даже выдает ошибки, а не перехватывает их, так как он выдает FileNotFound, когда у меня есть перехват для этого, и какой хороший способ определить, будет ли работать объект взаимодействия outlook.

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

У меня установлена ​​машина ХР 2007 года. поэтому я не мог проверить для всех случаев. Но этот код, кажется, работает.

public static bool IsOutlookInstalled()
{
    try
    {
        Type type = Type.GetTypeFromCLSID(new Guid("0006F03A-0000-0000-C000-000000000046")); //Outlook.Application
        if (type == null) return false;
        object obj = Activator.CreateInstance(type);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        return true;
    }
    catch (COMException)
    {
        return false;
    }
}
0 голосов
/ 22 декабря 2015
public bool IsOutlookInstalled()
{
    try
    {
        var officeType = Type.GetTypeFromProgID("Outlook.Application");
        if (officeType == null)
        {
            // Outlook is not installed.   
            return false;
        }
        else
        {
            // Outlook is installed.      
            return true;
        }
    }
    catch (System.Exception ex)
    {
        return false;
    }
}
...