【发布时间】:2014-03-27 06:57:21
【问题描述】:
我有以下代码实例化一个注册的 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 给出了这种性能瓶颈的确切原因。
为了解决这个问题,我尝试为处于压力下的 MakeRecord 方法定义一个全局 Action
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。所以,我的问题是,
如果这 IS 是正确的方法 来加快我的
dynamic调用,我如何将 COM 方法MakeRecord分配给我的Action委托?如果这不是正确的方法来加快我的
dynamic调用,是什么?
感谢您的宝贵时间。
我也试过做
object o = Activator.CreateInstance(type);
MethodInfo methodInfo = o.GetType().GetMethod("MakeRec");
【问题讨论】:
标签: c# performance com dynamic-language-runtime