2012-01-10 3 views
1

Я пытаюсь получить MAPIOBJECT из MailItem.AddressEntry, используя Late Binding with Outlook.Указанное вступление недействительно Получение MAPIOBJECT из MailItem.AddressEntry с использованием Late Binding

Я продолжаю получать «Исключение было выбрано целью вызова», а внутреннее исключение «Указанное вступление недействительно», и я понятия не имею, почему. Ничего не появилось в результатах поиска 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

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

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

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

+0

Спасибо, я закончил использовать это! Это очень полезно и позволило мне сделать то, что я получил. – doiley

+3

Существует [новая, высококачественная ** статья об управляемом MAPI **] (http://www.codeproject.com/Articles/455823/Managed-MAPI-Part-1-Logon-MAPI-Session-and -Ретриев) в проекте Code. –

1

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

+0

MSDN говорит, что он обесценился. Мой код работает за пределами перспективы. Я попытался добавить, что перед этой строкой: var mapiObject = GetProperty ("MAPIOBJECT", addressEntry); но безрезультатно. это правильный вызов: MAPIInitialize (IntPtr.Zero); – doiley

+0

Да, это должно сработать. Что происходит? Зачем нужен объект IMailUser MAPI? –

+0

Алос, вы уверены, что вы вызываете MAPIInitialize, экспортированный из правой DLL? –