how to call a C# function, foo(out byte [])? -- help passing a byte pointer
    6 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
    daniel rasnow
 il 5 Giu 2014
  
    
    
    
    
    Commentato: daniel rasnow
 il 28 Lug 2014
            Been struggling to call the following function in a C# dll:
public bool GetLatestBuffer(out byte[] buffer)
I've allocated the buffer in Matlab and tried various castings with libpointer, but keep getting the result:
No method 'GetLatestBuffer' with matching signature found for class ...
I could write a wrapper in C# that allocates the buffer ... but would rather do the memory management in Matlab.
My pseudocode is basically:
   NET.addAssembly(dllLoc)
   ls = luma_ns.Luma(initParams);
   ls.function1(params) % --> it works passing parameters by value
   buf = zeros(10000,'uint8'); % tried uint16, int16, etc.
   pbuf = libpointer('uint8Ptr',buf); 
   ls.GetLatestBuffer(pbuf) % doesn't match the prototype of out byte []
No method 'GetLatestBuffer' with matching signature found for class 'Luma_ns.Luma'.
Thanks!!
0 Commenti
Risposta accettata
  Friedrich
    
 il 21 Lug 2014
        
      Modificato: Friedrich
    
 il 22 Lug 2014
  
      Hi,
have you tried calling it like this
[bool_val, byte_array] = obj.GetLatestBuffer();
This works fine for me in 14a with the following example
C#
            public bool GetLatestBuffer(out byte[] Buffer)
            {
                Buffer = new byte[10];
                for (int i = 0; i < 10;i++)
                {
                    Buffer[i] = (byte)i;
                }
                return true;
            }
ML:
>> a = ClassLibrary1.Class1
a = 
Class1 with no properties.
>> [bool,array] = a.GetLatestBuffer()
bool =
       1
array = 
Byte[] with properties:
            Length: 10
        LongLength: 10
              Rank: 1
          SyncRoot: [1x1 System.Byte[]]
        IsReadOnly: 0
       IsFixedSize: 1
    IsSynchronized: 0
>>
SideNote: The out keyword forces the routine GetLatestBuffer to assign Buffer to some value. So you do NOT need to pass down a preallocated array and since you dont need to do this it appears as output in MATLAB directly.
Also in C# when using OUT you never pass down a preallocated array. So what MATLAB does is correct here and matches the .NET programming.
Più risposte (2)
  James Tursa
      
      
 il 5 Giu 2014
        Have you tried changing the header signature to something more friendly to MATLAB, but have the same basic I/O? E.g.,
bool GetLatestBuffer(char *buffer);
3 Commenti
  James Tursa
      
      
 il 6 Giu 2014
				Don't recompile. Just create a new header file off to the side for MATLAB to use. I.e., copy the actual header h file to a new file, modify that new file by changing the signature of the function in question, then use that new header h file for calllib in MATLAB.
  Friedrich
    
 il 22 Lug 2014
				This wont work because that is the .NET interface he is using and not loadlibrary!!!!
  Anthony
      
 il 17 Lug 2014
        Hi,
You can create a byte[] like this:
A = NET.createArray('System.Byte',4).
Then you just have to pass it to your function.
Hope it helps,
Anthony
Vedere anche
Categorie
				Scopri di più su .NET Client Programming in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



