Динамически загружать и использовать COM-объект в C # - PullRequest
4 голосов
/ 18 февраля 2011

У меня есть проект на C #, где я хотел бы получить доступ к MS Outlook, если он установлен на компьютере клиента. Часть "access outlook" была сделана путем ссылки на объект outlook COM и перехода оттуда. Моя проблема теперь в части «если она установлена». На данный момент мой проект не компилируется на машинах без установленного внешнего вида, поэтому я предполагаю, что мне не придется ссылаться на компонент внешнего вида, а вместо этого загружать и использовать его динамически, после обнаружения того, что внешний вид присутствует, но я не нашел способ сделать это. Я прав, и есть ли у кого-нибудь подсказки, как это сделать?

Спасибо.

Редактировать: Решено. Следуя совету, данному Хансом Пассантом в одном из комментариев об использовании офисных PIA, оказался путь наименьшего сопротивления. Мне было немного трудно получить PIA на моем компьютере без офиса, но это было преодолено с помощью принятого ответа на этот вопрос.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Вы определенно не сможете скомпилировать свою сборку на машине без присутствия COM-объекта Outlook, но это не значит, что ваше приложение полностью не сможет работать на машине без Outlook - просто эта попытка создать или использование COM-объекта Outlook приведет к возникновению сбоя / исключения.

Согласно этот вопрос лучший способ определить наличие или отсутствие COM-объекта - просто попытаться создать его экземпляр и перехватить полученное исключение в случае, если он не установлен.

1 голос
/ 14 марта 2011

Следуя совету Ханса Пассанта, теперь я отвечаю на свой вопрос с подробностями моего решения. Я смог скомпилировать и запустить свой проект на компьютере без установленного офиса. Основная проблема состояла в том, чтобы сообщить Visual Studio, какой интерфейс можно ожидать от COM-объекта. Это было решено путем нахождения файла первичной сборки интерфейса (PIA) для внешнего вида. Этот процесс лучше описан в этом вопросе, но короткая история состоит в том, что у меня уже были офисные PIA на моем компьютере, в этом месте:

C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA

Я использую VS2010 pro, я не знаю, включены ли файлы в другие версии. Затем нужно было скопировать соответствующий файл в исходную папку моего проекта, включив его в мой проект и систему контроля версий, и сделать ссылку на него. После этого я смог использовать типы COM Outlook в своем проекте и скомпилировать его без ошибок. Я также могу запустить свой проект без установленного офиса. Это достигается путем попытки создания экземпляров соответствующих объектов COM и перехвата исключения, если офис не установлен. В следующем примере кода показано, как:

using Outlook = Microsoft.Office.Interop.Outlook;

namespace Foo
{
    public class Bar
    {
        public void Quux()
        {
            try
            {
                // try to instantiate outlook COM object.
                Outlook.Application outlookApp = new Outlook.Application();

                // if it works, fine. Proceed
                ...
            }
            // If we catch a COMException, assume no office installed. Deal accordingly.
            catch (System.Runtime.InteropServices.COMException)
            {
                ...
            }
        }
    }
}
...