Type.InvokeMember Бросок «COMException: несоответствие типов» внутри метода Extension - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю с Adobe Acrobat SDK и пытаюсь очистить вызовы COM, поместив вызов InvokeMember в метод Extension, чтобы сделать код более читабельным.

Метод расширения, который я пытаюсь написать, выглядит следующим образом:

using System;
using System.Reflection;

public static class Invoke_Extension
{
    public static object CallJSfunction(this Object adobeComObject, string sJSfunction, params object[] oPlist)
    {

        Type T = adobeComObject.GetType();

        return T.InvokeMember(
                        sJSfunction,
                        BindingFlags.GetProperty | //fixed per Simon's comment
                        BindingFlags.Public |
                        BindingFlags.Instance,
                        null, adobeComObject, oPlist);
    }
}

Это заменит COM-вызовы в примере кода Adobe следующим образом:

    // Example from the Adobe SDK sample code
using System;
using System.Reflection;
using Acrobat;
//---------------- Create necessary objects ----------------------
    AcroAVDoc g_AVDoc = new AcroAVDoc();
    g_AVDoc.Open(filename, "");
    CAcroPDDoc pdDoc = (CAcroPDDoc)g_AVDoc.GetPDDoc();
    //Acquire the Acrobat JavaScript Object interface from the PDDoc object
    Object jsObj = pdDoc.GetJSObject();

//------- This is the part I am trying to make more readable --------
    Type T = jsObj.GetType();

    // total number of pages
    double nPages = (double)T.InvokeMember(
                "numPages",
                BindingFlags.GetProperty |
                BindingFlags.Public |
                BindingFlags.Instance,
                null, jsObj, null);

//-------------------------------------------------------------------------
//-- using the extension method, the two calls above are replaced with: ---

    double nPages2 = (double)jsObj.CallJSfunction("numPages", null);
/--------------------------------------------------------------------------
// ...but the InvokeMember call within the extension method is throwing an error.




//BTW, the optional parameters in the Extension method is because some of the functions have more than one parameter eg.
    object[] addTextWatermarkParam = { currentTime.ToShortTimeString(), 1, "Helvetica", 100, blueColorObj, 0, 0, true, true, true, 0, 3, 20, -45, false, 1.0, false, 0, 0.7 };
    T.InvokeMember(
            "addWatermarkFromText",
            BindingFlags.InvokeMethod |
            BindingFlags.Public |
            BindingFlags.Instance,
            null, jsObj, addTextWatermarkParam);
// which would be replaced with
    jsObj.CallJSfunction("addWatermarkFromText",currentTime.ToShortTimeString(), 1, "Helvetica", 100, blueColorObj, 0, 0, true, true, true, 0, 3, 20, -45, false, 1.0, false, 0, 0.7 );

Полная ошибка:

System.Reflection.TargetInvocationException HResult = 0x80131604 Сообщение = Исключение было сгенерировано целью вызова. Источник = mscorlib Трассировки стека: at System.RuntimeType.InvokeDispMethod (имя строки, BindingFlags invokeAttr, цель объекта, аргументы объекта [], логическое значение [] byrefModifiers, культура Int32, строка [] namedParameters) в System.RuntimeType.InvokeMember (имя строки, BindingFlags bindingFlags, связыватель связывания, объектная цель, Object [] provideArgs, модификаторы ParameterModifier [], CultureInfo culture, String [] namedParams) в System.Type.InvokeMember (имя строки, BindingFlags invokeAttr, связыватель Binder, цель объекта, аргументы объекта []) в Invoke_Extension.CallJSfunction (Object adobeComObject, String sJSfunction, Object [] oPlist) в Z: \ mike \ Downloads \ Adobe \ Acrobat DC SDK \ Версия 1 \ InterAppCommunicationSupport \ C # Samples \ JSObjectControlCS \ JSObjectControl_c. в JSObjectControlCS.JSObjectControlForm.searchButton_Click (Отправитель объекта, EventArgs e) в Z: \ mike \ Downloads \ Adobe SDK SDK Acrobat \ Версия 1 \ InterAppCommunicationSupport \ Образцы C # \ JSObjectControlCS \ JSObjectControlcs \ line: форма: в System.Windows.Forms.Control.OnClick (EventArgs e) в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) в System.Windows.Forms.Control.WmMouseUp (сообщение & m, кнопка MouseButtons, щелчки Int32) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ButtonBase.WndProc (сообщение & m) в System.Windows.Forms.Button.WndProc (сообщение & m) в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & msg) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID, причина Int32, Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (причина Int32, контекст ApplicationContext) в JSObjectControlCS.Program.Main () в Z: \ mike \ Downloads \ Adobe \ Acrobat DC SDK \ Версия 1 \ InterAppCommunicationSupport \ C # Samples \ JSObjectControlCS \ JSObjectControlCS \ Program.cs: строка 17

Внутреннее исключение 1: COMException: несоответствие типов. (Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))

...