Передать объект С# [] методу Matlab Dll

Я пытаюсь передать массив объектов С# методу Matlab, используя ключевое слово массива параметров params. Мой метод Matlab соответствует сборке .net Dll. Вот мой простой метод С#:

public void Method1(params object[] objArg)
{           
    _mMExt.mMethod1((MWArray[])objArg);
}

Я использую varargin в качестве входных данных для моей функции Matlab mMethod1:

function mMethod1(varargin)
    nVarargs = length(varargin);
end

Проблема в том, что я конвертирую object[] в MWArray[] следующим образом:

(MWArray[])objArg

Кажется, я могу использовать (MWArray)object1 для преобразования объекта C# в MWArray, но это не позволяет мне преобразовать массив объектов в массив MWArray.

Это возможно? если да, то как?

Заранее спасибо.


person NESHOM    schedule 13.04.2016    source источник
comment
Вы можете использовать Linq objArg.Cast<MWArray>().ToArray().   -  person juharr    schedule 13.04.2016
comment
@juharr - он компилируется, но когда я передаю целое число, он показывает исключение Невозможно преобразовать объект типа «System.Int32» в тип «MathWorks.MATLAB.NET.Arrays.MWArray».   -  person NESHOM    schedule 13.04.2016


Ответы (1)


Вот небольшой пример, который я тестировал.

Предположим, вы скомпилировали следующую функцию MATLAB в сборку .NET, используя MATLAB Compiler SDK :

myFunction.m

function myFunction(varargin)
    for i=1:nargin
        disp(varargin{i});
    end
end

Теперь в вашей программе на C# вы можете просто вызвать функцию myLib.myClass.myFunction, передав ей переменное количество входных аргументов, например:

Программа.cs

using System;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using myLib;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("calling myFunction(varargin)...");
        CallMyFunction(1, 2.0f, 3.14, "str4");
    }

    static void CallMyFunction(params MWArray[] varargin)  // or object[]
    {
        myClass obj = new myClass();
        obj.myFunction(varargin);
    }
}

Это эквивалентно явному написанию:

MWArray[] varargin = new MWArray[4];
varargin[0] = new MWNumericArray(1);
varargin[1] = new MWNumericArray(2.0f);
varargin[2] = new MWNumericArray(3.14);
varargin[3] = new MWCharArray("str4");

myClass obj = new myClass();
obj.myFunction(varargin);
person Amro    schedule 13.04.2016
comment
Да, я запутался с тем, что было предложено здесь (mathworks.com/help/mps/dotnet/). Спасибо. Итак, проблема в том, что object[] должен быть MWArray[]. Как вы предполагаете, что это может быть object[]? - person NESHOM; 14.04.2016
comment
в моем случае (R2016a) работали и MWArray[], и object[]. На самом деле проверяя сборку в обозревателе объектов, сигнатура сгенерированной функции public void myFunction(params object[] varargin) - person Amro; 14.04.2016
comment
Я тоже использую R2016a, но мой показывает params MWArray[] varargin. Знаете ли вы, что может быть причиной этого изменения? - person NESHOM; 14.04.2016
comment
ах теперь вижу. На самом деле сгенерированы две сборки myLib.dll и myLibNative.dll. Я добавил ссылку на последний. У первого есть подпись, как вы сказали... Для чего это стоит, вот соответствующая страница документации: mathworks.com/help/compiler_sdk/dotnet/. Также обратите внимание на целевую платформу проекта (версия .NET). - person Amro; 14.04.2016