Указанное преобразование неверно. Получение MAPIOBJECT из MailItem.AddressEntry с использованием позднего связывания. - PullRequest
1 голос
/ 11 января 2012

Я пытаюсь получить MAPIOBJECT объекта MailItem.AddressEntry с использованием позднего связывания с Outlook.

Я продолжаю получать "Исключение было сгенерировано целью вызова" и внутреннее исключение "Указанный приведен неверный", и я не знаю почему. Ничего не найдено в поиске Google и т. Д.

Во-первых, я знаю, что MAPIOBJECT устарел и не виден через intellisense, но работает.

Я могу получить объект без проблем без позднего связывания.

Вот код:

/// <summary>
/// Gets the MAPI Object from the AddressEntry of the new recipient.
/// </summary>
/// <param name="senderName">The name of the sender to add to the recipients.</param>
/// <param name="outlookApplication">The Outlook Application instance.</param>
private static object GetMapiObject(string senderName, object outlookApplication)
{
    var mailItem = InvokeMember("CreateItem", outlookApplication, new object[] { 0 });
    var recipients = GetProperty("Recipients", mailItem);
    var recipient = InvokeMember("Add", recipients, new object[] { senderName });

    InvokeMember("Resolve", recipient, new object[] {});
    var addressEntry = GetProperty("AddressEntry", recipient);

    var mapiObject = GetProperty("MAPIOBJECT", addressEntry); // Error occurs here.
    return mapiObject;
}

/// <summary>
/// Gets a property of an instance by its name
/// </summary>
/// <param name="propertyName">The property name to get.</param>
/// <param name="instance">The object to get the property from.</param>
/// <returns>The resulting object.</returns>
private static object GetProperty(string propertyName, object instance)
{
    Type type = instance.GetType();
    return type.InvokeMember(propertyName, BindingFlags.GetProperty, null, instance, new object[] { });
}

/// <summary>
/// Invoke an object by its method and type - takes parameters.
/// </summary>
/// <param name="method">The method to invoke.</param>
/// <param name="instance">The object that contains the method to invoke.</param>
/// <param name="parameters">The parameters to pass to the method.</param>
/// <returns>The resulting object.</returns>
private static object InvokeMember(string method, object instance, object[] parameters)
{
    try
    {
        Type type = instance.GetType();
        return type.InvokeMember(method, BindingFlags.InvokeMethod, null, instance, parameters);
    }
    catch (Exception ex)
    {
        switch (method)
        {
           case "SaveAsFile":
                throw new System.IO.IOException("Error occurred during \"SaveAsFile\" for attachments. Attachment filename may be too long. ", ex);                                                

            default:
                throw new TargetInvocationException("Handled error at Invoke Member. Method Name: " + method, ex);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Если вам не нужно использовать интерфейс MAPI, я настоятельно рекомендую использовать проект MAPIEx в CodeProject.

Это сделало нашу интеграцию MAPI очень гладкой.

И, в худшем случае, исходный код может пролить свет на конкретные вопросы, такие как этот.

1 голос
/ 11 января 2012

Во-первых, MAPIOBJECT не является устаревшим, просто невидимым. Во-вторых, где работает ваш код? Если это исполняемый файл, отличный от outlook.exe (т. Е. Ваш код отсутствует в надстройке COM), необходимо вызвать MAPIInitialize ().

...