如何在Matlab中处理非标准委托

时间:2015-10-16 02:03:16

标签: c# matlab

我使用的是用C#编写的Matlab程序集。我已经做了很多工作,但我遇到了一个问题。我有一个这样的课:

typedef int type; //choose your custom type/struct/class
int iFirst = 100000; //first index to copy
int iLast = 101000; //last index + 1
int iLen = iLast - iFirst;
std::vector<type> newVec;
newVec.resize(iLen); //pre-allocate the space needed to write the data directly
memcpy(&newVec[0], &myVec[iFirst], iLen*sizeof(type)); //write directly to destination buffer from source buffer

然后我尝试以下方法:

classdef Mt4Class
% stuff left out
    methods     
    function self = Mt4Class(theIp, thePort) 
        self.IP = theIp;
        self.Port = thePort;
        NET.addAssembly('C:\Program Files (x86)\MtApi\MtApi.dll');
        self.apiClient = MtApi.MtApiClient(); 
    end

    function AddListenerQuoteUpdated(self, callback)
        addlistener(self.apiClient, 'QuoteUpdated', callback);
    end

    function MyQuoteUpdate(~, ~, symbol, bid, ask)
        disp(symbol, bid, ask);
    end
end
end

然而,Matlab回来时出现错误:

mtapi = Mt4Class('', 8222);
mtapi.AddListenerQuoteUpdated(@(~,~, symbol, bid, ask)mtapi.MyQuoteUpdate(0, 0, symbol, bid, ask));

我没有Api的来源。如果我这样做,将参数打包成.NET events with nonstandard delegate definition are not supported in MATLAB. 会很简单。我也可以将API库包装在我自己的程序集中,以EventArg形式重新激活事件以符合Matlab,但这看起来很笨拙。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

看起来没有,我只是遇到了同样的问题,但在我的情况下,我确实拥有触发事件的DLL。

https://msdn.microsoft.com/en-us/library/w369ty8x.aspx

你可能想要做的就是做我正在做的事情。

基本上,您想要创建一个DLL包装器,它将从原始DLL中获取Bid和Ask值,然后将它们放在返回该值的单个对象中。 ExpandoObjects听起来很棒,但我怀疑它们在Matlab中很容易使用来获取值。我使用Dictionary来获取对象。

编写一个调用密封DLL的简单DLL包装器(您可以从本机DLL中侦听复杂事件)。然后在C#中创建一个Dictionary,并将原始文件添加为dict.Add(&#34; core&#34;,ddlldata),然后添加dict.Add(&#34;其他&#34;,更多数据)。

然后创建一个事件并将该字典发送到Matlab。您可以在Matlab中的.net对象上使用.ITEM(&#34; key&#34;)。值操作,并获取两个值。

如果您想查看示例,我可以提供代码。