У меня есть следующий код, который создает экземпляр зарегистрированного COM-объекта
private dynamic server = null // Global variable.
...
Type type = Type.GetTypeFromProgID("Svr.GrpCall");
this.server = Activator.CreateInstance(type);
Я могу просто вызывать методы из этого объекта COM/dynamic
, используя очень интуитивно понятную нотацию.
string expectedResult = this.server.GroupInit(someString, someBoolean);
Для одиночных вызовов производительность вызова таких методов через среду выполнения динамического языка (DLR) приемлема. Однако для одного требования мне нужно использовать двойной цикл for
для тысяч записей, который использует метод в COM-объекте, который возвращает void
for (int i = 0; i < MAXREC; i++)
for (int j = 0; j < MAXFIELDS; j++)
this.server.MakeRecord(s1, s2, str);
Это ОЧЕНЬ медленно. Я знаю об этом, и ответ Эрика Липперта https://stackoverflow.com/a/7480977/626442 дает точную причину этого узкого места производительности.
Чтобы обойти это, я попытался определить глобальный Action
для метода MakeRecord
, который находится под давлением.
private Action<short, short, string> makeRecord;
где планируется использовать это в цикле for выше. Прежде чем использовать этот Action
, я пытаюсь сначала инициализировать сервер (как указано выше), а затем назначить делегата makeRecord
методу COM, используя
Type type = Type.GetTypeFromProgID("Svr.GrpCall");
this.server = Activator.CreateInstance(type);
MethodInfo methodInfo = type.GetMethod("MakeRecord");
makeRecord = (Action<short, short, string>)Delegate.CreateDelegate(type, methodInfo);
Но type.GetMethod("MakeRecord")
возвращает null
. Итак, мой вопрос,
Если эта ЯВЛЯЕТСЯ правильной методологией для ускорения моих
dynamic
вызовов, как мне назначить COM-методMakeRecord
моему делегатуAction
?Если это НЕ правильный метод для ускорения моих звонков
dynamic
, то что?
Спасибо за ваше время.
Я также пытался сделать
object o = Activator.CreateInstance(type);
MethodInfo methodInfo = o.GetType().GetMethod("MakeRec");