Явное преобразование - PullRequest
1 голос
/ 10 июля 2019

Рассмотрим следующий код:

using Microsoft.Office.Interop.Outlook;
using OutlookApp = Microsoft.Office.Interop.Outlook.Application;

namespace OutlookInterop
{
    class Program
    {
        static void Main(string[] args)
        {
            OutlookApp outlookApp = new OutlookApp();
            MailItem mailItem = outlookApp.CreateItem(OlItemType.olMailItem);
            mailItem.To = "test@test.com";
            mailItem.Subject = "Test Email Alert";
            mailItem.HTMLBody = "<html><body>Test email body.</body></html>";
            mailItem.Display(false);
        }
    }
}  

Этот код отлично работает, когда я запускаю его в Visual Studio, но когда я использую его в BluePrism, я получаю следующую ошибку компилятора:

Page: Send Email Alert c#
Stage: Code1
Type: Error
Action: Validate
Description: Compiler error at line 2: Cannot implicitly convert type 'object' to 'Microsoft.Office.Interop.Outlook.MailItem'. An explicit conversion exists (are you missing a cast?)
Repairable: No

Я думаю, что я ссылался на правильные сборки в BluePrism, т.е.:
enter image description here

И тогда это код внутри фактической стадии кода:

    OutlookApp outlookApp = new OutlookApp();
    MailItem mailItem = outlookApp.CreateItem(OlItemType.olMailItem); //this would be line 2
    mailItem.To = "test@test.com";
    mailItem.Subject = "Test Email Alert";
    mailItem.HTMLBody = "<html><body>Test email body.</body></html>";
    mailItem.Display(false);

Итак, почему этот код работает в Visual Studio, а не в BluePrism?что это за актерский состав, который отсутствует?

Ответы [ 2 ]

10 голосов
/ 10 июля 2019

Я сильно подозреваю, что разница заключается в том, как импортируется библиотека Office. Если вы посмотрите на свойства для ссылки в вашем проекте Visual Studio, я подозреваю, что это покажет, что для свойства "Embed Interop Types" установлено значение True. Это не только встраивает типы взаимодействия, но также создает методы и свойства, которые вместо этого возвращают object return dynamic - именно поэтому код будет компилироваться.

Я не знаю, есть ли у BluePrism опция для таких COM-библиотек. Если это не так, просто при явном приведении к MailItem.

3 голосов
/ 10 июля 2019

Неявного преобразования не существует, поэтому .Net не знает, как преобразовать с помощью простого присваивания.

См. Этот вопрос для получения подробной информации о неявных и явных преобразованиях;

Однако в сообщении об ошибке указывается, что имеется явное преобразование, поэтому вам необходимо добавить явное приведение к вашему коду.

MailItem mailItem = (MailItem)outlookApp.CreateItem(OlItemType.olMailItem);
...