2015-07-29 8 views
-1

Я пытаюсь использовать Pinvoke для вызова функций Matlab из C#.Вызвать mexCallMATLAB с C#

Моя конфигурация проекта:

  • C++ проект, который использует "mex.h" вызвать интерфейс "mexCallMATLAB"

Пример:

#include "stdafx.h" 
#include <stdarg.h> 
#include <string> 
#include "matrix.h" 
#include "mex.h" 

extern "C" _declspec(dllexport) bool blockExists() 
{ 
    std::string blockPath = "model/myblockpath"; 
    mxArray *pin[1]; 
    int nin = 1; 
    mxArray *pout[1]; 
    int nout = 1; 
    pin[0] = mxCreateString(blockPath.c_str()); 
    if (mexCallMATLAB(nout, pout, nin, pin, "find_system") != 0) { 
     callStatus = false; 
    } 
    mxDestroyArray(pin[0]); 
    return callStatus; 
} 
  • C# Proj ЭСТ, который использует PInvoke для вызова предыдущего C++ проект

Пример:

using System.Runtime.InteropServices; 

    namespace ManagedMatlabWrapper 
    { 
     public class MatlabWrapper 
     { 
      [DllImport(@"MatlabAPI.dll")] 
      private static extern bool blockExists(); 

      public static bool blockExistsAPI() 
      { 
       bool result = blockExists(); 
       return result; 
      } 
     } 
    } 

Все компилирует ОК

Но когда я запускаю код, он дает мне ошибку DLL не найден исключения.

Я проверил DLL, сгенерированную с помощью хоста зависимостей, и показывает, что некоторые библиотеки Matlab не найдены. Если я изменю код и удалю любую ссылку на Matlab, Pinvoke будет работать нормально.

enter image description here

Кто-нибудь знает, Что не хватает? Что делать, чтобы вызвать mexCallMATLAB с C#?

ответ

2

mexCallMATLAB не будет работать, если он не вызван из процесса MATLAB через MEX-файл. Без этого существует слишком много неинициализированного контекста. Таким образом, даже если вы получите нужные DLL на пути поиска, он будет сбой при попытке выполнить его.

Похоже, что вам будет лучше смотреть на MATLAB Engine API или на MATLAB COM Automation Server.

+0

Я боялся, что вы скажете это ... :-) После нескольких тестов я пришел к такому же выводу. О альтернативах, каково ваше мнение о скорости и совместимости MATLAB COM с Simulink (модели чтения, параметры настройки и т. Д.)? – guilhermecgs

+1

Совместимость, не должно быть никаких проблем. Функция Feval в основном такая же, как mexCallMATLAB. Скорее, у меня недостаточно опыта, чтобы дать вам полезный ответ. – SCFrench

0

Ошибка сообщает вам, что не все зависимости могут быть найдены. Ваше описание подсказывает, что находится ваша C++ DLL. Но в свою очередь это зависит от, по крайней мере, libmex, libmx и msvcr90. Некоторые или все эти зависимости не могут быть разрешены.

Одним из дешевых (и грязных) способов решения проблемы было бы добавить каталоги, содержащие библиотеки MATLAB, к PATH. Лучшим способом было бы изменить путь поиска DLL с вызовом SetDllDirectory или AddDllDirectory перед первым вызовом p/invoke, который ведет к MATLAB.

Вопрос MSVCR90 может быть разрешен путем установки распространяемого пакета MSVC для этой версии MSVC.

Наконец, MATLAB предоставляет свои возможности через узлы .net. Почему вы не используете их, чтобы избежать этой сложности.

+0

MATLAB Builder NE требуется MCR, установленный на конечной машине пользователя для работы. Besisdes, мне также нужна лицензия на 20 тыс. – guilhermecgs

+0

Ops, моя вина ... На самом деле мне очень понравился ваш совет ... Я не английский, поэтому мои комментарии, как правило, слишком прямые и неполитические, хотя я стараюсь избегать этого. Это было не мое внимание – guilhermecgs

+0

Ну, вы знаете, что мне теперь делать, я думаю. –