我正在尝试使用后期绑定连接到由名为Amibroker的程序提供的COM自动化API,使用C#WinForms项目。到目前为止,我已经能够连接到API中的所有内容,除了一个项目,我相信它是基于广泛谷歌搜索的“参数化属性”。
根据文档(此处为完整版:http://www.amibroker.com/guide/objects.html),以下是API规范的外观:
Property Filter(ByVal nType As Integer, ByVal pszCategory As String) As Long [r/w]
更新值的javascript代码段如下所示:
AB = new ActiveXObject("Broker.Application");
AA = AB.Analysis;
AA.Filter( 0, "market" ) = 0;
使用以下C#后期绑定代码,我可以获取属性的值,但我不能为我的生活找出如何设置值:
object[] parameter = new object[2];
parameter[0] = Number;
parameter[1] = Type;
object filters = _analysis.GetType().InvokeMember("Filter", BindingFlags.GetProperty, null, _analysis, parameter);
到目前为止,我已经尝试过:
从我所看到的,这应该是直截了当的,但我发现C#中的后期绑定充其量只是麻烦。该属性看起来像一个方法调用我,这是什么让我失望。如何为方法赋值,以及后期绑定C#代码的原型会是什么样的呢?
希望这能解释得很好,但随时可以问我是否遗漏了任何不清楚的内容。在此先感谢您的帮助!
丹尼尔
答案 0 :(得分:1)
是的,COM中的属性是作为方法实现的。方法名称应为“set_Filter”。我认为你遇到问题的真正原因是因为你要通过VB6声明。 VB6 Long类型在C#中实际上并不长,它是一个int。尝试使用long值分配属性将失败。
在VB.NET中编写此代码可以使 lot 更容易,它完全支持后期绑定方法和属性访问,使用类似于Java的“自然”语法。并且支持索引属性,与C#不同。编写一个可以在C#项目中引用的小包装程序集。自VS2010以来,它也可以在C#中使用新的动态关键字。
答案 1 :(得分:0)
这是转换为C#的VB代码。它不符合汉斯的评论。
object x = RuntimeHelpers.GetObjectValue(Interaction.CreateObject("Broker.Application", ""));
NewLateBinding.LateSetComplex(NewLateBinding.LateGet(x, null, "Analysis", new object[0], null, null, null), null, "Filter", new object[] { 0, "market", 0x22 }, null, null, false, true);
感谢大家的帮助!