Я работаю с 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))