Здравствуйте, все.
Помогите, пожалуйста разобраться. Мне надо из программы на С# обратиться к МатЛабу и выполнить там набор преобразований, а затем вернуть данные обратно.
Я подключаю в Reference: Matlab Automation Server Type Library.
И в обработчике например кнопки пишу:
MLApp.MLAppClass V;
Array MReal=Array.CreateInstance(typeof(double),new int[2]{2,4},new int[2]{0,0});
Array MImag=Array.CreateInstance(typeof(double),new int[2]{2,4},new int[2]{0,0});
V=new MLApp.MLAppClass();
V.Execute("a=[1 2 3 4; 5 6 7 8;];");
V.GetFullMatrix("a","base",ref MReal, ref MImag);
for(int i=0; i<2; i++)
for(int j=0; j<4; j++)
lbx.Items.Add(i.ToString()+":"+j.ToString()+" - "+MReal.GetValue(i,j).ToString());
V.Quit();
И в процессе работы всегда возникает ошибка на строчке V.Execute(...);
An unhandled exception of type 'System.InvalidCastException' occurred in mscorlib.dll
Additional information: QueryInterface for interface MLApp.DIMLApp failed.
Помогите, пожалуйста, кто знает в чем дело.
Андрей.
пардон за оффтоп:
а где можно почитать об использовании матлабовских ф-ий из под .нета ?
Автор благодарит русский алфавит за предоставленные буквы.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Используй позднее связывание. Там DISPID у методов, кажется, перепутаны.
Всем спасибо за внимание к проблеме.
Действительно она решилась после написания простенького класса правда на VB.Net (в Матлабе оказывается был пример по программированию с испорльзованием VB

).
Всем кому интересно привожу текст единственного класса промежуточной библиотеки для взаимодействия с Матлабом.
Public Class cMatlab
Dim MatLab As Object
Public Sub InitializeA()
MatLab = CreateObject("Matlab.Application")
End Sub
Public Sub FinalA()
Call MatLab.Quit()
End Sub
Public Sub GetFullMatrixA(ByVal a As String, ByVal bs As String, ByRef pr As Double(,), ByRef pi As Double(,))
Call MatLab.GetFullMatrix(a, bs, pr, pi)
End Sub
Public Sub PutFullMatrixA(ByVal a As String, ByVal bs As String, ByRef pr As Double(,), ByRef pi As Double(,))
Call MatLab.PutFullMatrix(a, bs, pr, pi)
End Sub
Public Function ExecuteA(ByVal name As String) As String
ExecuteA = MatLab.Execute(name)
End Function
End Class
Для вызова надо подключить получившуюся сборку и где-нибудь в обработчике события написать что-то типа:
mt_class.cMatlab V=new mt_class.cMatlab();
double[,] MReal=new double[2, 4];
double[,] MImag=new double[1, 1];
V.InitializeA(); // инициализация и связь с матлабом
// в этом методе можно писать любое выражение, как это делается в матлабовских M-файлах
V.ExecuteA("surf(peaks)");
V.ExecuteA("a = [1 2 3 4; 5 6 7 8;]");
// Возвращает двумерный массив из Матлаба в программу
V.GetFullMatrixA("a","base", ref MReal, ref MImag);
Вроде все работает.
Андрей.
Это баг MatLab. Надо создать .reg файл, следующего содержания:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}]
@="DIMLApp"
[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}\ProxyStubClsid]
@="{00020420-0000-0000-C000-000000000046}"
[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}\ProxyStubClsid32]
@="{00020420-0000-0000-C000-000000000046}"
[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}\TypeLib]
@="{C36E46AB-6A81-457B-9F91-A7719A06287F}"
"Version"="1.0"
и выполнить его.