我有以下代码实例化已注册的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);
MASSIVELY 慢。我知道这一点,Eric Lippert的回答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");
答案 0 :(得分:2)
您如何知道缓慢的行为是由于使用dynamic
?
dynamic
而不使用任何反射方法)?您可以添加对COM程序集本身的引用,以自动创建托管包装程序。