MATLAB Answers

how can MATLAB handle .NET methods that have a REF parameter?

12 views (last 30 days)
Cristian Berceanu
Cristian Berceanu on 26 Mar 2019
Edited: Guillaume on 27 Mar 2019
I have a .NET dll which provides the following capability:
TMCTL cTmctl = new TMCTL();
int ret = 0;
ret = cTmctl.Initialize(TMCTL.TM_CTL_ETHER, ",anonymous,", ref id );
I need to use this dll file in Matlab, and so far I can succesfully reference the dll and create the necessary object:
YK_TMCTL = NET.addAssembly('C:\Windows\SysWOW64\TmctlAPINet64.dll');
Oscilloscope = TmctlAPINet.TMCTL;
However, I have difficulties in callig the Initialize function, this code always retunrs 1, wihch means the function could not establish a connection:
int32DeviceID = int32(0);
int32InstrumentAnswer = Oscilloscope.Initialize(Oscilloscope.TM_CTL_ETHER,',anonymous',int32DeviceID);
Oscilloscope.TM_CTL_ETHER is just a constant, it's not giving me any trouble. But I believe the int32DeviceID is the problem and I do not know how to succesfully pass this 'reference' variable.
Note that I have looked at this answer and I have subsequently tried:
[int32InstrumentAnswer,int32DeviceID] = Oscilloscope.Initialize(Oscilloscope.TM_CTL_ETHER,',anonymous')
Unfortunatelly this fails with the following error: No method 'Initialize' with matching signature found for class 'TmctlAPINet.TMCTL'.
Hence, the question in the title.
  1 Comment
Guillaume on 26 Mar 2019
what does
methods(Oscilloscope, '-full')
says the full signature of Initialize is (there may be several, in which case, show them all).
Oh, and what is the actual documented .Net signature?

Sign in to comment.

Accepted Answer

Guillaume on 26 Mar 2019
Edited: Guillaume on 26 Mar 2019
If we go by your .Net code, the correct matlab version should be:
id = int32(0); %you probably don't even need the int32. matlab should do the conversion automatically
[ret, id] = Oscilloscope.Initialize(Oscilloscope.TM_CTL_ETHER, ',anonymous,', id);
ref parameters are both inputs and outputs in matlab. See Call .Net methods With ref Keyword
If that doesn't work then answer my comment to your question.
Guillaume on 27 Mar 2019
In C# and a lot of other languages, the compiler automatically adds an extra input to class member functions, usually as the first input. This argument is always the class instance on which the function is called. So, for example, the method:
//.Net code
//class definition
public class TMCTL{
public int Initialize(int wire, string comm, ref int id){
//... implementation
is automatically converted, at compile-time to
public int Initialise(TMCTL this, int wire, string comm, ref int id)
because the function actually needs to know which object it operates on. This extra argument is all invisible to you, and the compiler also adds it in function calls:
ret = cTmctl.Initialize(TMCTL.TM_CTL_ETHER, ",anonymous,", ref id );
is compiled as
ret = Initialize(cTmctl, TMCTL.TM_CTL_ETHER, ",anonymous,", ref id);
In matlab however, the developpers decided to leave that job to you. So whenever you implement a class method in matlab, you must make sure that the object is an explicit input argument.
%matlab code
classdef TMCTL
methods (Access = public)
function [result, id] = Initialise(this, wire, comm, id)
Matlab still does the job of transforming function calls, but you can also do it yourself
%both of these work in matlab and are more or less equivalent (there's a slight difference of scope that is not relevant)
[ret, id] = cTmctl.Initialize(TMCTL.TM_CTL_ETHER, ",anonymous,", id);
[ret, id] = Initialize(cTmctl, TMCTL.TM_CTL_ETHER, ",anonymous,", id);
if the username is "anonymous" then there is no further need for a password, however, it seems the comma still needs to be there.
Yes, that makes sense. The code probably split the string at commas and expect 3 strings after the split.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!